2011-04-07 28 views
16

我已經在C中編寫了一個簡單的隨機數生成器。int l是下限,int u是上限。srand(time(NULL))不會快速更改種子值

它工作得很好,但是我有關於播種它的問題。如果我要在一個循環中運行它,time(NULL)不會快速更改種子值,以防止獲得連續的一系列完全相同的隨機數。

我想知道其他人如何解決這個問題。我在網上找到的所有示例都使用time(NULL)作爲種子值生成器。

int generateRandom(int l, int u) 
{ 
    srand(time(NULL)); 

    int r = rand() % ((u - l) + 1); 
    r = l + r; 

    return r; 
} 

如果我是緊挨着彼此碰撞的幾行代碼,無論是Rand1Rand2將是完全一樣的。

printf("Rand1 = %d\n", generateRandom(10, 46)); 
printf("Rand2 = %d\n", generateRandom(10, 46)); 
+8

呃!不要將變量命名爲簡單的'l'!偏好'lb','lower','lowerbound',... – pmg 2011-04-07 08:24:13

回答

19

srand(time(NULL))應該只運行一次以初始化PRNG。在應用程序啓動時在Main中執行此操作。

說明:

甲PRNG(僞隨機數發生器)產生依賴於所使用的算法編號的確定性序列。給定的算法將始終從給定的起點(種子)產生相同的序列。如果你沒有明確地給出PRNG的種子,那麼每次應用程序運行時它通常會從相同的默認種子開始,導致使用相同的數字序列。

要解決此問題,您需要在每次運行應用程序時使用不同的種子(以提供不同的序列)對PRNG進行種子處理。通常的做法是使用time(NULL),它根據當前時間設置種子。只要你在一秒鐘內不啓動應用程序的兩個實例,就可以保證一個不同的隨機序列。

每次你想要一個新的隨機數時,不需要給序列加上種子​​。我不確定這一點,但我有這樣的感覺,即根據所用的PRNG算法,對每個新數字重新播種可能實際上導致所得序列中的隨機性較低。

+2

至少,再次播種不會對質量有所幫助,即使它沒有受到傷害。它至少如果每次都從'時間(NULL)'播種。 – 2011-04-07 01:46:52

7

種子一次在主開始。如果你在同一秒內過快加入,你最終會得到相同的數字。

5

不要每次都播種,只能在節目的開始播放。

此外,許多書籍建議不要使用C-lib標準隨機函數。如果您需要良好的僞隨機數,Press等人的Numerical Recipes,3rd中有一個很好的算法。版。

+0

但是,要小心NR,書中代碼的許可證條款非常繁瑣,如果您輸入該版本,我基本上禁止任何類型的版本控制或網絡文件存儲! – Flexo 2011-09-17 13:24:13

4

我假設你從另一個函數main或其他函數調用generateRandom函數。

如果您在函數內聲明種子,您將重置函數。重置該功能,將使相同的數字出現幾次,同一秒鐘。

移動srand(time(NULL));到主要功能將解決問題。

1

如果您正在使用不同的工藝,使用(rand()+getpid())%range; 我用它來使用隨機值多次測試相同的程序的第二(如果您蘭特號碼,退出程序,並再次運行速度非常快,這個數字將是相同)

4

srand((unsigned) time(NULL) * getpid());

產生更多樣化的隨機集合(在OSX 10.8),包括短週期的測試。

+0

如果你使用的是OS X 10.8並關心隨機性,你應該使用'arc4random()'或'arc4random_uniform()'。 – dreamlax 2013-07-23 01:00:22

相關問題