2012-07-30 38 views
3

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/處,我讀了以下內容:該算法使用種子來生成系列,應使用srand將其初始化爲某個獨特的值。瞭解rand()操作

種子是什麼意思,以及rand()如何使用seed來生成系列?

+0

rand()使用的隨機數生成器通常不是很好,你必須弄清楚如何將它的輸出轉換成你自己想要的分佈。 C++ 11在其''標頭中提供了一個更好的庫。 – bames53 2012-07-30 05:52:15

回答

2

非常好聽的,它是這樣的:

int rand() { 
     return last_random_val = 
      ((last_random_val * 1103515245) + 12345) & 0x7fffffff); 
    } 

    void srand(int seed) { 
     last_random_val = seed; 
    } 

當你罵srand()last_random_val設置爲seed。因此,對於相同的種子,生成相同的數字序列。

+0

0x7fffffff是什麼意思? – Programmer 2012-07-30 05:32:40

+0

這是一個用於綁定結果的掩碼,因此不會生成負數。 – perreal 2012-07-30 05:33:13

+0

@編程器:獲得編號的31個LSB位。 – SuperSaiyan 2012-07-30 05:33:40

7

rand()使用所謂的pseudo-random number generator。它不會產生真正的隨機數,而是一個確定性的序列,看起來看起來足夠隨機並滿足一些統計特性。種子本質上是該序列的起始值;給定相同的種子,PRNG將始終產生相同的序列。這就是爲什麼你經常種下一些不是確定性,例如。當前時間(儘管如果您將PRNG重新植入一個緊密的循環中,或者連續或並行運行程序足夠快,則失敗)。

在大多數情況下,C中的PRNG是一個簡單的linear congruential generator。它計算與下面的公式序列中的下一個數字:

​​

一個b這裏是必須謹慎選擇,避免horrible results值。例如,由於顯而易見的原因,對於a來說2是非常不好的選擇。 c只是將數量減少到一定的範圍,並且通常是2的冪。種子只提供第0個值。

+0

給你一個向上箭頭:) – Programmer 2012-07-30 05:48:27