用人腦生成等概率隨機(jī)數(shù),困擾人類30萬年的問題解決了 | 附“源代碼”
如何避免人類對數(shù)字偏好的差異
曉查 發(fā)自 凹非寺
量子位 出品 | 公眾號 QbitAI
讓人類隨機(jī)說出一個1-10之間的整數(shù)(包括1和10),每個數(shù)字被選中的概率都是10%嗎?答案當(dāng)然是否定的。
半年前,有人對8500名學(xué)生做了一項調(diào)查,發(fā)現(xiàn)人類似乎對7有種特殊的偏好,有接近3成的人會選擇“7”,而選擇兩端數(shù)字的概率會偏小,選“10”人甚至僅有1.9%。
如果用計算機(jī),我們就可以生成近乎完全隨機(jī)的數(shù),保證每個數(shù)被抽中的概率都是10%。(注:其實計算機(jī)生成的是偽隨機(jī)數(shù),并不完全隨機(jī),但效果遠(yuǎn)勝過人類。)
在這件看似超級簡單的事情上,人腦輸給了電腦。人類隨機(jī)函數(shù)human.random遠(yuǎn)不及Numpy里的np.random啊。
難怪有Twitter網(wǎng)友會調(diào)侃:智人誕生30多萬年以來就沒能解決這個問題。
因為人類是有情感的:1和10分別位于兩端,選擇這樣兩個數(shù)是否會太刻意?7是不是我的幸運數(shù)字?潛意識里的想法都會左右你最終的選擇。
那該怎么辦?
怎么才能把人類隨機(jī)函數(shù)變成真正的隨機(jī)函數(shù),要做的就是把概率分布大于10%的數(shù)挪到概率小于10%的數(shù)上。
你可以想象成切碎這些長條并重新排列,讓它們都一樣高:
舉一個極端的例子,假設(shè)我們將每個長條都“切割”成無限小的塊,然后就可以像樂高一樣使用這些塊來建立任何形狀的概率分布。
現(xiàn)在,我們來定義這樣一個變量xi,j,它表示我們把數(shù)字i調(diào)整到數(shù)字j的樣本占數(shù)字i總樣本中的比例。
因為選7的人比較多,我們希望把部分7調(diào)整到1,如果把20%的7變成1,那么x7,1=0.2。xi,i表示自身不調(diào)整的部分。
最后我們希望所有隨機(jī)數(shù)的概率都是0.1,所以其他數(shù)字調(diào)整進(jìn)j的比例之和應(yīng)該滿足:
同時,我們還必須確保原始分布中的所有概率質(zhì)量(probability mass)都是守恒的。所以每個i調(diào)整到1到10的總概率應(yīng)該等于1(注:原文如此,應(yīng)等于原本選擇數(shù)字i的概率Pi)。
另外,我們還希望盡可能保留原始的分布,也就是讓xi,i(保持不動的部分)之和最大,即不調(diào)整的部分盡可能多。
現(xiàn)在這個問題就變成了一個線性規(guī)劃問題,在這20個約束條件下,令對角元素之和最大。
經(jīng)過電腦計算后,調(diào)整方案是這樣的:
這個結(jié)果雖然直觀卻不夠精確,準(zhǔn)確的調(diào)整比例為:
按照上面的圖表,選7的結(jié)果中有28%的比例需要調(diào)整為10,20%的比例需要調(diào)整為1,等等。
但是這28%、20%的比例如何獲得,最初的隨機(jī)分布表就可以啊。
本來就有28%的人選擇7,如果我們獲得了一個7,在問第二個人,如果也得到一個7,我們就把第一個7強(qiáng)制轉(zhuǎn)換成1。
人腦隨機(jī)數(shù)生成器
現(xiàn)在你明白人類隨機(jī)數(shù)生成器的工作原理了,下面就是這套程序的“源代碼
按照這個程序,你應(yīng)該能得到一個接近平均的從1到10的隨機(jī)數(shù)發(fā)生器,前提是你得有8500個人。
以上算法的思路和代碼和源代碼來自博客:
https://torvaney.github.io/projects/human-rng



