这与这个问题有关 - 在C++中生成随机数...第一个数字不是很随机
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
srand((unsigned int)time(NULL));
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果一遍又一遍地运行二进制(.exe),您会注意到第一个结果始终具有相同的前三个数字.例如每次运行总是0.54xxxxx.
不,这不是因为我发现没有任何模式.并且在每次运行之间等待几秒也没有帮助.
编辑:只有第一个结果具有前三个相同的数字.其余的都是"随意看".此外,生成器使用srand()(在上面的代码示例的第一行)上播种.
rand标准未规定随机性.大多数生成器将使用种子来初始化静态变量,并以一种应该"随机出现"(当然,完全确定性)的方式计算其中的下一个值.我的猜测是你机器上的实现返回静态变量的旧值,它等于第一次通过的种子.(这种让我惊讶的是,通常会返回静态的新值.)
无论如何,这是一个实施质量的问题.(我在VC++ 11中看到了相同的内容,但g ++没有.)
编辑:
只是一个快速测试,看看种子变化如何影响返回的第一个数字:
for ( int i = 1; i <= 10; ++ i ) {
std::srand( i );
std::cout << i << ": " << std::rand() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
VC++ 11的输出:
1: 41
2: 45
3: 48
4: 51
5: 54
6: 58
7: 61
8: 64
9: 68
10: 71
Run Code Online (Sandbox Code Playgroud)
使用g ++ 4.7.2(CygWin版本):
1: 1481765933
2: 816048218
3: 150330503
4: 1632096437
5: 966378722
6: 300661007
7: 1782426941
8: 1116709226
9: 450991511
10: 1932757444
Run Code Online (Sandbox Code Playgroud)
你说你在代码块下使用g ++看到了这个:我只能猜测代码块设置的东西,以便g ++使用Microsoft库,而不是GNU(通常是更好的解决方案).
无论如何,解决方案很简单:替换您现在用于为发电机播种的单线:
std::srand( std::time( NULL ) );
std::rand(); // throw out first value...
Run Code Online (Sandbox Code Playgroud)
如果你需要相对较好的随机数,那么std::rand
完全放弃C++ 11中一些更严格定义的生成器.(如果你不使用C++ 11,你可以从Boost获得它们.)
| 归档时间: |
|
| 查看次数: |
1735 次 |
| 最近记录: |