偽隨機數的演算法
1. 淺析c語言中的偽隨機數
哈嘍,大家好,我是北方素素~
首先給大家解釋一下這個標題,什麼叫做「淺析」呢?就是稍微分析一下,哈哈。用了「淺析」就突然感覺高大上了,其實並沒有多深奧,只是以鏈棗羨我的理解給大家解釋一下。
我們知道,在一些書籍中,使用C語言生成隨機數一般是這樣寫的:
srand(unsigned(time(NULL)));
int rand_number = rand();
這里主要涉及到了三個函數,srand(),rand()和time()。
不知道這三個函數是做什麼的?MSDN文檔中解釋了這三個函數的作用:
srand():Sets the starting seed value for the pseudorandom number generator(設置偽隨機數生成器的起始種子值)。
它的搭檔rand():Generates a pseudorandom number(生成一個偽隨機數)。
而time()的解釋就更簡單了:Get the system time(獲得系統時間)。
這三個函數組合在一起,就可以生成隨機數。
細心的同學可能會發現這里有一個特殊的詞-偽隨機數。那麼什麼是偽隨機數呢?
關於偽隨機數的概念我就不多說了,大家自行搜索一下就有很多解釋,在這里我只說一下自己的理解:
先說一下真隨機,真隨機也就是我們日常說的隨機,一個隨機事件的結果是不確定的,比如拋硬幣,在正常情況下,拋硬幣的結果是不確定的,換句話說,結果是不可預測的。
然後說說偽隨機,偽隨機是計算機生成隨機數的一種方式,計算機不能真正模仿隨機事件,而只能通過計算來生成隨機數。換句話說,如果我們知道了計算機計算隨機數的演算法,我們是可以預測偽隨機數的。
當然我們得用例子說話。
從上面的討論我們可以知道,因為rand()產生的數字是偽隨機數,所以它一定有一個固定的演算法來生成偽隨機數,那麼演算法是固定的,不固定的只有srand()所設置的種子了。
確定了這一點之後,我們就可以做實驗驗證我們的猜想了。
如果srand()設定的種子是一個固定值會發生什麼?
srand(1);
int rand_number = rand();
在我執行了N次之後,結果都是固定的。(大家可以親自試一試)
這就說明我們的「隨機數」就是通過某種演算法計算出來的結果,所以要想這個結果發生變化,就需要設定一個不斷變化的「種子」。
那麼這里也就解釋了「種子」的作用-用來給隨機數生成器提供一個輸入,之後隨機數生成器就會使用這個「種子」生成不同的偽隨機數。
舉個栗子~
如果我們的隨機數生成演算法是這樣的:
rand=1+x;
那麼我們的「種子」就是上式中的x,,每當我們輸入不同的x,產生的結果rand也就會不同。
至於為什麼選擇time()作為「種子」嘛,上面說了,這個函數呢,用來獲取系統時間,因為系統時間是一直在變化的,就相當於我們隨機數的「種子」是在一直變化的,所以每次調用time()函數,都會獲得不同的值,這樣我們的rand()每次生成的結果也就不一樣啦~
最後總結一下這三個函數在生成偽隨機數的時候是怎麼配合的。
首先,time()獲取了系統時間;然後,srand()把獲取到的系統時間設置為rand()的「種子」;最後,由rand()通過計算,把「種子」轉換為一個數字。
好啦,這篇文章就寫到這里了~
歡迎大家訪問我的網站:https://bfss.github.io/,如岩缺果覺得我的文章幫到了您,可以在網站上點擊「支持我」對我進行鼓勵喲~(手機端網頁在左上角棚拍,電腦端網頁在右上角)
https://www.bilibili.com/read/cv311534
出處: bilibili
2. 如何評價一個偽隨機數生成演算法的優劣
偽隨機數演算法的優劣可以從以下方面考慮:
1) 隨機數分布的均勻性
2)隨機數生成速度
3)周期性(循環的周期 個人理解)
准備入門計算機的新手。還請諸位大神指正。
3. 偽隨機數怎麼找規律
真正意義上的隨機數(或者隨機事件)在某次產生過程中是按照實驗過程中表現的分布概率隨機產生的,其結果是不可預測的,是不可見的。而計算機中的隨機函數是按照一定演算法模擬產生的,其結果是確定的,是可見的。我們可以這樣認為這個可預見的結果其出現的概率是100%。所以用計算機隨機函數所產生的「隨機數」並不隨機,是偽隨機數。
一般地,偽隨機數的生成方法主要有以下3種:
(1) 直接法(Direct Method),根據分布函數的物理意義生成。缺點是僅適用於某些具有特殊分布的隨機數,如二項式分布、泊松分布。
(2) 逆轉法(Inversion Method),假設U服從[0,1]區間上的均勻分布,令X=F-1(U),則X的累計分布函數(CDF)為F。該方法原理簡單、編程方便、適用性廣。
(3)接受拒絕法(Acceptance-Rejection Method):假設希望生成的隨機數的概率密度函數(PDF)為f,則首先找到一個PDF為g的隨機數發生器與常數c,使得f(x)≤cg(x),然後根據接收拒絕演算法求解。由於演算法平均運算c次才能得到一個希望生成的隨機數,因此c的取值必須盡可能小。顯然,該演算法的缺點是較難確定g與c。
因此,偽隨機數生成器(PRNG)一般採用逆轉法,其基礎是均勻分布,均勻分布PRNG的優劣決定了整個隨機數體系的優劣。下文研究均勻分布的PRNG。
偽隨機數發生器
4. 偽隨機數演算法(basic進,不要c語言)
知道的不多,呵呵~~~~~~~~~
所謂偽隨機數,就是說vb中所謂的隨機數函數(Rnd)並不是真正(完全)的隨機數,它還是受到某些條件約束的。舉個例子吧,新建一個工程,然後在form_load事件中加入Msgbox
Rnd,不加其它任何語句,你會發現程序每次運行時彈出的數據都相同。
所以,若要生成較好的隨機數,一般會在使用Rnd之前先使用randomize或randomize
timer。