在同一程序中调用srand()两次

时间:2014-02-12 11:16:42

标签: c++ visual-c++ random srand

为什么当我在两个非常不同的点上调用srand()时它会导致数字不是随机的?一旦我删除其中一个,它就会恢复正常。

4 个答案:

答案 0 :(得分:7)

这取决于你如何称呼它。 srand()的目的是为rand()使用的伪随机数生成器播种。因此,当您致电srand(i)时,它会将rand()初始化为一个取决于i的固定序列。因此,当您使用相同的种子重新播种时,您将开始获得相同的序列。

最常见的用例是将生成器只播种一次,并使用合适的“随机”值(例如惯用time(NULL))。这个保证使得你可能会在不同的程序执行中获得不同的伪随机数序列。

但是,偶尔您可能希望使伪随机序列“可重放”。想象一下,您正在测试随机数据上的几种排序算法。为了得到公平的比较,您应该在完全相同的数据上测试每个算法 - 因此在每次运行之前,您将使用相同的种子重新生成生成器。

换句话说:如果您希望数字只是伪随机,则种子一次,并且值尽可能随机。如果你想要一些控制和重播性,种子必要。

答案 1 :(得分:1)

srand (seed);
  

使用相同种子的两个不同初始化将生成   随后对兰德的调用也会产生相同的结果。

     

如果seed设置为1,则将生成器重新初始化为其初始值   value并产生与调用rand或之前相同的值   函数srand。

     

每次使用srand()播种rand()时,它必须生成相同的内容   价值序列。

http://www.cplusplus.com/reference/cstdlib/srand/

http://en.cppreference.com/w/cpp/numeric/random/srand

答案 2 :(得分:0)

你在初始化srand吗?你必须在函数/代码的开头初始化它,如下所示:

srand(time(NULL));

它应该工作:)

答案 3 :(得分:0)

您可以阅读有关伪随机数生成器,标准库srand-rand函数是其中之一的实现。 核心思想是使用特殊数字 - 种子初始化伪随机生成器。 srand()用于设置种子。对于每个种子伪随机生成器,生成完全相同的数字序列。通过使用不同的种子,您将获得不同的数字序列。 因此,如果您希望每次启动程序时都获得不同的随机数,则每次都需要设置新的种子。 最简单的方法之一是使用种子时间。

#include <time.h>

srand((unsigned int)time(0));