博客 / 詳情

返回

隨機數種子

隨機數和偽隨機數

隨機數

真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等,這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高。
----百度百科

根據百科上的定義可以看到,真隨機數是依賴於物理隨機數生成器的。使用較多的就是電子元件中的噪音等較為高級、複雜的物理過程來生成。

使用物理性隨機數發生器生成的真隨機數,可以説是完美再現了生活中的真正的“隨機”,也可以稱為絕對的公平。

偽隨機數

真正意義上的隨機數(或者隨機事件)在某次產生過程中是按照實驗過程中表現的分佈概率隨機產生的,其結果是不可預測的,是不可見的。而計算機中的隨機函數是按照一定算法模擬產生的,其結果是確定的,是可見的。我們可以這樣認為這個可預見的結果其出現的概率是100%。所以用計算機隨機函數所產生的“隨機數”並不隨機,是偽隨機數。
—百度百科

從定義我們可以瞭解到,偽隨機數其實是有規律的。只不過這個規律週期比較長,但還是可以預測的。主要原因就是偽隨機數是計算機使用算法模擬出來的,這個過程並不涉及到物理過程,所以自然不可能具有真隨機數的特性。

for (int i = 0; i < 10; ++i)
    {
        cout<<rand()<<" ";
    }
    cout<<endl;

連續兩次運行這個過程,結果是一樣的。(程序簡單,自行試驗)
這就是偽隨機數了!!!!
就好像是在系統中已經有了一個0~RAND_MAX的一個亂序序列,我們調用rand()的時候都是參照這個序列和隨機種子的,這裏沒有設置隨機種子,因此隨機種子為1,當隨機種子為x的時候,我們可以根據這個隨機種子x來計算出一個隨機數f(x, m),其中m為這個序列中的偽隨機數。如果隨機種子是固定的,那麼每次調用rand()依然可以計算出來了。

1.3隨機種子

由上面我們就知道了,所謂隨機數其實是偽隨機數,所謂的‘偽’,意思是這些數其實是有規律的,只不過因為算法規律太複雜,很難看出來而已。

但是,再厲害的算法,如果沒有一個初始值,它也不可能憑空造出一系列隨機數來,我們説的種子就是這個初始值。

random隨機數是這樣生成的:我們將這套複雜的算法(是叫隨機數生成器吧)看成一個黑盒,把我們準備好的種子扔進去,它會返給你兩個東西,一個是你想要的隨機數,另一個是保證能生成下一個隨機數的新的種子,把新的種子放進黑盒,又得到一個新的隨機數和一個新的種子,從此在生成隨機數的路上越走越遠。

JS常用包

seedrandom

報地址

npm install seedrandom
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.