2016-11-22 24 views
0

我試圖尋找關於如何使用mt19937ar.c變種梅森難題的例子,但大多數想出在C++others seem to use mtwist.h梅森倍捻機(mt19937ar.c)沒有返回隨機數

我下面的代碼:

int getRandomNum(void) 
{ 
    int i; 
    i = (int) genrand_int32(); 
    return i; 
} 

int main(int argc, char **argv) 
{ 
    ... 
    int m = getRandomNum(); 
    printf("m = %d", m); 
    ... 
    return 0; 
} 

只是一遍又一遍吐出相同的整數。看起來像一個播種問題,但我發現每個實現獲得一個隨機數mt19937只是簡單地調用genrand_int32()。我做錯了嗎?

回答

1

Mersenne Twister不是神奇的;它無法從可預測的輸入中產生隨機結果。如果你想要一個隨機序列,你必須通過調用init_genrand()以某種獨特的價值種子發生器。否則它將使用固定的默認種子(具體爲:5489)。

一個簡單的價值,採用的是當前的時間:

init_genrand(time(NULL)); 

不要叫其再次你的程序中,雖然 - 否則,你會重新啓動的順序!

+0

謝謝!這有幫助。 – 8protons

+0

你的第一句話並不是真的有效,如果沒有明確給出種子,它可能會播種rng。沒有魔法是必需的...... – Apollys

+0

@Apollys正如我在回答中所解釋的,OP所使用的實現默認爲5489的種子。它是一個非常舊的可移植實現,所以它不能使用'time()'之類的函數。 (它們不在所有平臺上存在!) – duskwuff