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