我正在使用srand()以便在我的c / c ++程序中有一些伪随机性。
我想知道srand(1)和srand(2)是否具有随机性,比方说,srand(21254)和srand(9897455)?
因为,我正在使用不同数量的种子运行我的程序,而且我的印象不同!
最好的问候
答案 0 :(得分:1)
正如评论所说,如果你担心随机数的质量,你应该使用一个真正的随机数字库。
srand()
和rand()
通常是基本的周期性伪随机数生成器。将有一个固定的值序列循环,所有这些值都在一行中。如果您收到12作为您的最后一个号码,并且收到600作为您的下一个号码,那么下次循环回滚到12时您将再次收到600作为您的下一个号码。
因此,种子不会影响伪随机数的“随机性”或质量。致电srand(21254)
或srand(9897455)
只是从同一序列的不同点开始。
注意:rand()
的特定实现可能不使用此方法:但是,它不太可能,并且在没有任何保证的情况下,您最好使用{ 的{3}}保证了用于生成随机数的方法。该库中的类将产生更高质量的随机数序列。
答案 1 :(得分:0)
您在评论中说,您不能选择更好的随机数生成器。这是一种耻辱,因为C ++从C ++ 11开始有the random
header,而且它比旧的rand
/ srand
有了很大的改进。
您在srand
中使用的种子与从rand
拉出的结果数字之间肯定存在相关性,这就是整个播种点。一些C ++实现会比其他实现更明显,因为rand
的实现没有严格指定,而是留给每个库。
隐藏这种相关性的最简单方法是在播种后取一些随机数并简单地将它们丢弃,因为每次生成的数字相关性变得不那么明显。如果它没有,它将不是一个可接受的随机数发生器。
srand(1);
cout << "throwing away " << rand() << endl;
cout << "throwing away " << rand() << endl;
cout << "using " << rand() << endl;
srand(2);
cout << "throwing away " << rand() << endl;
cout << "throwing away " << rand() << endl;
cout << "using " << rand() << endl;