你認為不可能發生的事情有哪些?
最硬核的技術博客,使用代碼展示一下,出乎人們常識的“不可能”。
大家在生活領域,歷史領域,教育領域,藝術領域,
從不同角度口述了一些不可能發生的事。
科技領域,通過代碼,讓事實說話
硬幣問題概率論,是來自上帝的學問。
經典概率模型中,有一個共同特點:
1 - 試驗的樣本空間只包含有限個元素;2 - 試驗中每個基本事件發生的可能性相同。
拋硬幣問題,就是一個經典的等可能概型。
每一次拋擲硬幣,要么正面,要么反面,且正反面出現的機會均等。
更均等的隨機函數我們下面示例,將會使用PHP實現,隨機函數使用mt_rand。它可以更好更快地生成隨機數。
為了檢驗其隨機性,我們使用一個檢測的測試用例,測試一下。代碼如下:
經過10^8次方運算,也就是一億次循環,得到結果如下:
zero = 50005017,[50.005016]; one = 49994984,[49.994984].
zero = 49999797,[49.999797]; one = 50000204,[50.000203].
zero = 50004411,[50.004410]; one = 49995590,[49.995590].
zero = 50003164,[50.003163]; one = 49996837,[49.996837].
zero = 49999658,[49.999658]; one = 50000343,[50.000342].
zero = 50002590,[50.002589]; one = 49997411,[49.997411].
在命令行多終端同時運行,所得結果如上??梢姵霈F0/1的機會均等。
三枚硬幣我們擴展開來說,依次拋出三枚硬幣,所得的正反情況。
每一組所得的結果,無外乎下面這幾種情況:
0 0 00 0 10 1 00 1 11 0 01 0 11 1 01 1 1一共八種情況。
老規矩,運行一億次,看代碼和結果。
各種情況概率很平均,沒有明顯偏差,這與預期相符。
同樣地,一次拋出3枚硬幣,所得概率基本相同,代碼如下:
結果一樣,遵循均等分布。
來玩一把游戲那么,重點來了,如果我們兩個人約定,
依次拋一枚硬幣,
遇到 正反反,你給我一元;
遇到 反反正,我給你一元;
一起玩兒嗎?
本著程序員該有的懶惰,我們使用程序快速模擬這個過程,看看機會是否均等。
如果機會均等,這就拼的是個人運氣,無所謂,一切都是天注定,贏了輸了認命。
其實這段代碼,我分別使用了10輪,100輪,1000輪,以至一百萬輪的結果。
基本印證了一個結果:
上述規則,出現正反反的次數,基本是反反正次數的3倍。
這個游戲是偏離直覺認識的,是不公平的。
不公平之處,就在于前提規則,打斷了隨機過程。
因為每輪出現正反反,或反反正,立即退出,重新洗牌。
兩句多余的話不要相信直覺,在判斷一個規則是否公平之前,還是做好調查、模擬、計算。
直覺,有時候,真的不可信。