2016-11-22 28 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