理解Excel的隨機(jī)數(shù):注意事項(xiàng),使用技巧,真正的隨機(jī)數(shù)


這是之前寫(xiě)的一篇”理解Excel“系列里的文章,開(kāi)始發(fā)在公眾號(hào)上?,F(xiàn)在搬運(yùn)過(guò)來(lái)。

Excel提供了三個(gè)生成隨機(jī)數(shù)的函數(shù):RAND,RANDBETWEEN,RANDARRAY。
要用好這幾個(gè)函數(shù)以及隨機(jī)數(shù),有一些事情應(yīng)該了解。
隨機(jī)數(shù)會(huì)重復(fù):如何得到一組唯一的隨機(jī)數(shù)
很多人會(huì)有一個(gè)潛意識(shí)中的誤解,認(rèn)為這些函數(shù)生成的隨機(jī)數(shù)是唯一的。其實(shí),這是沒(méi)有任何保證的。
有時(shí)候一定會(huì)生成重復(fù)的隨機(jī)數(shù),比如,下面的公式:
這個(gè)公式生成1到10之間的整數(shù),返回一個(gè)10行10列的數(shù)組,其中必然有很多是重復(fù)的:

即使你生成小數(shù),甚至生成一個(gè)很大范圍的小數(shù),比如:
看上去沒(méi)有重復(fù)的數(shù)值:

但是,這是沒(méi)有保證的。實(shí)際上,只要你進(jìn)行足夠多的次數(shù)的重算,可以肯定一定會(huì)出現(xiàn)重復(fù)值。
所以,如果你希望得到不重復(fù)的隨機(jī)數(shù),可以使用UNIQUE函數(shù):
但是,因?yàn)閮?nèi)層的RANDARRAY函數(shù)不保證唯一,所以UNIQUE函數(shù)返回的不一定是10個(gè)元素。如果要想得到10個(gè)不重復(fù)的隨機(jī)數(shù),可以加大隨機(jī)數(shù)的范圍,例如,將RANDARRAY的第4個(gè)參數(shù)從100變成1000000?;究梢员WC得到10個(gè)不重復(fù)的記錄。
可以將上面的公式改寫(xiě)為:
先用RANDARRAY生成一個(gè)比較大(1000行)的數(shù)組,隨機(jī)數(shù)范圍比較大。然后用UNIQUE函數(shù)取出其中的不重復(fù)結(jié)果,最后,使用CHOOSE函數(shù)返回其中的前10行。(這個(gè)方法可以保證取出的絕對(duì)不重復(fù)。但是不保證一定可以取出10個(gè)數(shù)值。如果沒(méi)有10個(gè)不重復(fù)值,就會(huì)返回錯(cuò)誤值)。
偽隨機(jī):如何得到真正的隨機(jī)數(shù)
需要說(shuō)明的是,Excel中的這三個(gè)函數(shù)生成的隨機(jī)數(shù)都不是真正的隨機(jī)數(shù),而是偽隨機(jī)數(shù)。實(shí)際上它們是通過(guò)一個(gè)復(fù)雜的算法來(lái)模擬隨機(jī)數(shù)。如果你了解這個(gè)算法,你甚至可以預(yù)測(cè)下一個(gè)隨機(jī)數(shù)是多少。(當(dāng)然,這非常困難)。
真正的隨機(jī)數(shù)一般是物理生成的,所以我們一般沒(méi)有辦法直接使用。有一個(gè)網(wǎng)站,
https://www.random.org/
號(hào)稱可以生成真正的隨機(jī)數(shù)。不過(guò)我沒(méi)有研究過(guò)這個(gè)網(wǎng)站,因?yàn)樗荒苌呻S機(jī)數(shù),然后復(fù)制到Excel中,所以也不方便使用。
當(dāng)然,實(shí)際中也沒(méi)有太多非常需要真正的隨機(jī)數(shù)的地方。(甚至,我個(gè)人都非常懷疑是否存在真正的隨機(jī)數(shù)??)。對(duì)于大部分應(yīng)用來(lái)說(shuō),偽隨機(jī)數(shù)就足夠了。在Excel 2003之前,隨機(jī)數(shù)的算法還是有點(diǎn)問(wèn)題,不過(guò)之后的版本已經(jīng)升級(jí)了算法,所以,可以放心地使用它們。不用關(guān)心是否真正的隨機(jī)。
如果非要使用真正的隨機(jī)數(shù),這里有一個(gè)我認(rèn)為不錯(cuò)的方法:使用NOW()函數(shù)。這個(gè)函數(shù)返回當(dāng)前的時(shí)間,我們知道,時(shí)間就是數(shù)值:

我們可以將這個(gè)時(shí)間的最后幾位作為隨機(jī)數(shù)使用:
這個(gè)公式就可以返回0-100之間的隨機(jī)的整數(shù)。
需要時(shí)生成隨機(jī),然后不再改變的方法
很多時(shí)候,我們對(duì)隨機(jī)數(shù)的需求是間歇性的:需要時(shí)生成隨機(jī)數(shù),然后不再改變,就像扔骰子。
我們當(dāng)然可以使用函數(shù)生成隨機(jī)數(shù),然后再粘貼成數(shù)值。但是這樣做的話,下次需要隨機(jī)數(shù)時(shí),就需要重新寫(xiě)公式。
還有一種方法,就是寫(xiě)完隨機(jī)數(shù)公式后,將計(jì)算方式改為手動(dòng)。然后每次需要隨機(jī)數(shù)的時(shí)候都重新計(jì)算。但是這種方法對(duì)其他的公式也有影響。
這里推薦大家使用Power Query。
在Excel中新建一個(gè)空查詢,然后創(chuàng)建以下步驟:
你可以將這段代碼復(fù)制到Power Query的高級(jí)編輯器中,然后點(diǎn)擊完成。也可以自己按照上述代碼添加各個(gè)步驟。具體請(qǐng)參見(jiàn)本公眾號(hào)的Power Query相關(guān)文章。
實(shí)際上也是使用了M語(yǔ)言中的Number.Random和Number.RandomBetween兩個(gè)函數(shù)。類似于Excel中的RAND和RANDBETWEEN函數(shù)。
結(jié)果如下:

分別生成了一列0-1之間的隨機(jī)數(shù)和1到100之間的隨機(jī)數(shù)。