起因
當(dāng)然不是什么新發(fā)現(xiàn)。。。
事情的起因是,一個同學(xué)在朋友圈發(fā)表了一個狀態(tài),表示他因忘記旅行箱密碼而暴力破解,嘗試300次后成功破解。
回復(fù)區(qū)里大家對他的密碼到底是什么展開了討論,有人認(rèn)為他從000開始嘗試,300次后應(yīng)該密碼是299。也有人認(rèn)為300是個粗略的估計,可能是300多也可能是280+。
我比較認(rèn)同300是一個粗略估計的說法,但事實上人在暴力破解自己的密碼時,往往會優(yōu)先嘗試自己常用的組合形式而非從000一直干到999。
在這個前提之下,也就沒有必要真的去研究這位朋友的密碼到底是多少了,但是這反倒讓我更有興趣去了解一下暴力破解密碼的技巧。比如說,這個密碼箱的密碼你是不知道的,而其主人不是一個隨隨便便將自己生日或者000作為密碼的人,那么如果你采用每次用一個均勻分布隨機(jī)數(shù)來破解密碼,300次可以破解的概率是多少呢?
問題更加直觀的表達(dá)是,口袋里有1000個均質(zhì)小球,外觀質(zhì)量相同,一個是黑色球,999個白色球,每次取出一個,300次取出黑色球的概率是多少。
這里我故意含糊其辭,原因是這樣的,這個問題可以是“A:300次以內(nèi)取出黑色小球的概率”,也可以是“B:在第300次時取出黑色小球的概率”。
A與B是兩種不同的概率問題,雖然同屬古典概率模型,但計算方法不同,下面逐一分析。
A問題
A問題的計算方法可采用集合進(jìn)行計算,即全集是“1000個球中取300個”,關(guān)注的子集為“300個球中,包含所有1個黑球中的1個黑球和999個白球中的299個白球”,所以MATLAB計算這個問題:
p=nchoosek(1,1)*nchoosek(999,299)/nchoosek(1000,300);
結(jié)果是0.3
B問題
B問題就不同了,它指的是剛好在第300次抽中,這就意味著要經(jīng)歷299次失敗之后才能抽中,MATLAB的解答是:
N=1000;
p=1;
for i=1:299
? ? p=p*(1-1/N);
? ? N=N-1;
end
p=p/N;
結(jié)果是0.001
結(jié)論
有趣的是,繞了一大圈發(fā)現(xiàn)第300次抽中黑球和第一次抽中黑球概率是相同的,是不是很有意思!然而這個問題早已被人發(fā)現(xiàn),就像抓鬮一樣,第一個抓的人和第一百個抓的抓到獎品的概率實際上是相同的。
而A問題的結(jié)論則表明,這個概率就是等于300/1000,繞了一圈也白繞了。也就是說實驗的次數(shù)與成功概率成正比例。