srand(time(NULL))生成类似的结果

hyp*_*not 3 c++ random visual-studio-2010 visual-studio

我不明白为什么srand()在运行之间生成如此相似的随机数!

我试图运行以下代码

srand ( time(NULL) );
int x = rand();
cout << x << endl;
Run Code Online (Sandbox Code Playgroud)

然而,不是一个适当的随机数,我总是得到几乎相同的数字,随着时间的推移,这个数字正在缓慢增长.所以我得到的数字如:11669,11685,11701,11714,11731.

我究竟做错了什么?

我正在使用Visual Studio 2010 SP1.

好吧,srand()真的那么简单吗?我的意思是如何将其称为随机函数?

srand(1) => rand() = 41
srand(2) => rand() = 45
srand(3) => rand() = 48
srand(4) => rand() = 51
....
Run Code Online (Sandbox Code Playgroud)

Jam*_*nze 10

首先,srand()不是随机函数; 它设置了伪随机序列的起点.有点令人惊讶的是,你的实现rand()似乎是返回一个基于前一个状态的值,而不是新计算的状态,因此调用后的第一个值srand()很大程度上取决于传递给的值 srand().如果你要写:

srand( time( NULL ) );
rand();
std::cout << rand() << std::endl;
Run Code Online (Sandbox Code Playgroud)

,我相信你会看到更多的不同.

FWIW:我在Windows和Linux上都尝试了以下方法:

int
main()
{
    srand( time( NULL ) );
    int r1 = rand();
    std::cout << r1 << ' ' << rand() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我以一秒的间隔调用了10次,得到了:

16391 14979
16394 25727
16397 3708
16404 25205
16407 3185
16410 13933
16417 2662
16420 13411
16427 2139
Run Code Online (Sandbox Code Playgroud)

使用Windows下的VC++ - 你会注意到第一次调用rand()-and的方差非常小

1256800221 286343522
955907524 101665620
1731118607 991002476
1428701871 807009391
44395298 1688573463
817243457 1506183315
507034261 1310184381
1278902902 54648487
2049484769 942368151
1749966544 1833343137
Run Code Online (Sandbox Code Playgroud)

在Windows下使用g ++; 在这种情况下,即使读取的第一个值也是相对随机的.

如果你需要一个好的随机发生器,你可能不得不使用Boost中的一个; 该标准没有说明应该使用什么算法,并且实现在质量上有很大差异.


Kyl*_*yle 7

确保你做的

srand ( time(NULL) );
while(condition) {
    int x = rand();
    cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)

并不是

while(condition) {
    srand ( time(NULL) );
    int x = rand();
    cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)

每次迭代都会改变种子的第一种方式.第二种方法是在每次迭代时对非常相似的种子执行随机函数(因为时间变化不大).