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中的一个; 该标准没有说明应该使用什么算法,并且实现在质量上有很大差异.
确保你做的
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)
每次迭代都会改变种子的第一种方式.第二种方法是在每次迭代时对非常相似的种子执行随机函数(因为时间变化不大).