2012-11-07 27 views
9

相同的序列我有以下的方法,其产生随机数:兰特()总是返回上应用程序重新启动

int random_number() //Random number generator 
{ 
    int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000 
    return x; 
} 

给此方法的呼叫在一个循环中它迭代五次使用。这种方法的问题在于,它几次运行该程序时似乎总是生成相同的数字。这怎么解决?

+3

['srand()'](http://www.cplusplus.com/reference/clibrary/cstdlib/srand/)可能派上用场。但是,如果发现1000000明显大于[RAND_MAX](http://www.cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/)的大多数实现定义,则可能会郁闷地采用该模数。 – WhozCraig

回答

17

您需要seed随机数发生器,如:

srand (time(NULL)); 
int x = rand() % 1000000 + 1; 

播种的伪随机数发生器从根本上决定设定,它会遍历随机数。使用时间是实现充分随机结果的标准方法。

编辑:

为了澄清,你应该只有一次种子,并得到很多的随机数,这样的事情:

srand (time(NULL)); 
loop { 
    int x = rand() % 1000000 + 1; 
} 

不是一样的东西:

loop { 
    //Particularly bad if this line is hit multiple times in one second 
    srand (time(NULL)); 
    int x = rand() % 1000000 + 1; 
} 
+0

您的建议奏效,但似乎该数字并未从一个循环更改为下一个循环。因此,所有文件最终具有相同的名称 – Matthew

+0

如果您正在迭代循环,请不要在每次迭代中调用srand。只称它一次,然后兰德无数次。如果每次都调用两次,则同一秒内的任何调用都将返回相同的数字(因为时间(NULL)将返回相同的值)。 – femtoRgon

+0

谢谢。这解决了这个问题:) – Matthew

5

当您的程序启动时拨打srand(time(NULL));

srand为rand函数设置种子。赋予它0123,的返回值有助于在每次程序运行时获得不同的种子。

当您将问题标记为C++时,您可以使用C++ 11功能来处理random号码生成。

+0

你的建议工作。但是,所有五个文件现在都有相同的名称:s – Matthew

+1

什么文件(你在说什么)? – tomahh

1

femtoRgon是正确的。这将播种计划,但看看在新的C++标准,因为他们已经改善随机数生成 看到

Random numbers in C++0x

1

兰特是不是一个真正的随机数,而是一个伪随机一个,仅仅“如果您不知道用于生成值的算法,则看起来是“随机的”。从手册页:

的rand()函数返回值的范围为0〜RAND_MAX包容

伪随机意味着给定相同的输入的伪随机整数,称为种子,它会给出相同的输出。当您尝试调试问题时,这实际上非常有用,因为将返回相同的“随机”值,让您重现问题。 如果你真的需要随机性,这很糟糕。

如上所述,通过在每次运行中将种子改变为不同的东西,比如自从epoch以来的秒数,您可以从调用rand()获得不同的值。

srand(time(NULL)) 

如果您尝试调试,您​​可能需要打印出种子,以便在发生问题时可以重现问题。