c++rand()和来自boost的RNG生成相同的数字(在发布模式中),即使srand(0)也是如此
c++ rand() and RNG from boost generating the same numbers(in release mode) even with srand(0)
我使用rand()在一个函数中生成一些随机数来填充一些数组,但当我运行该程序时,我注意到它总是给出相同行的生成数。数组中填充了同一行生成的数字,可以全部为0,也可以是一行不同的数字,但这种数字模式在每个数组中都是相同的。
所以我用debug一步一步地运行这个程序,它成功了,rand()为每个数组生成了不同的数字。。
在这之后,我决定尝试另一种方法来生成随机数。我找到了一种使用Boost库来实现这一点的方法。
这是我现在使用的代码:
int main(){
typedef boost::mt19937 RNGType;
RNGType rng( (unsigned int)time(NULL));
boost::uniform_int<> one_to_six( 1, 6);
boost::variate_generator< RNGType, boost::uniform_int<> >
dice(rng, one_to_six);
for(int i=0;i<10;i++){
std::cout<<dice()<<std::endl;
}
}
如果我在main()函数上使用这段代码,一切都很顺利,它会给我10个随机数。但是,如果我把这个代码放在一个函数中,以便随时调用它,它会给我返回相同的数字。总是55555555或0000000。。有趣的是,如果我使用debug并在该函数上设置断点,然后一步一步地运行它,它会再次工作,给我不同的数字。所以我不知道我在这里错过了什么。。
edit:当我使用rand()时,我使用的是srand((unsigned int)time(NULL))
更新1:
int random(int begin,int end){
typedef boost::mt19937 RNGType;
RNGType rng( (unsigned int)time(NULL));
boost::uniform_int<> one_to_six( begin , end );
boost::variate_generator< RNGType, boost::uniform_int<> >
dice(rng, one_to_six);
return dice();
}
int main() {
for(int i=0; i<10; i++)
cout<<random(0,6)<<endl;
}
如果我使用这种方法,它会给我相同的顺序。如果我通过调试一步一步地运行它,它会起作用,并给我不同的数字。
您在每个函数调用中为rng播种,因此您总是从一个种子开始获得一个随机序列(长度为1)。由于使用time(NULL)
作为种子,因此一秒内的所有调用都将获得相同的种子,从而获得相同的序列。
由于您不想重复使用相同的序列,因此不应该在对random
的调用之间为rng种子,而是继续上一次调用的序列,就像在完全位于main
内部的版本中所做的那样。这需要您在调用之间维护生成器对象的状态,而不是每次都构造一个新对象。
找到了另一种方法,现在可以工作了。
如果有人需要,我会把代码放在这里
boost::random::mt19937 gen;
int random(int begin, int end)
{
boost::random::uniform_int_distribution<> dist(begin, end);
return dist(gen);
}
int main(){
for(int i=0;i<10;i++)
std::cout << random(0,20) << std::endl;
}
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么在保护模式下继承升级不起作用
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- 为什么控制台要求输入,即使代码中没有输入
- g++ 说函数不存在,即使包含正确的标头
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 使用可变模板的Broadcaster/Listener模式
- c++方法参数只能在linux的发布模式下自行更改
- 无法在硬件模式下创建 SGX 安全区 - "invalid launch token"即使文档将无效的启动令牌指定为第一个
- 防病毒软件如何能够在读取模式下打开文件,即使该文件被拒绝读取和写入
- c++rand()和来自boost的RNG生成相同的数字(在发布模式中),即使srand(0)也是如此
- 即使在二进制模式下,Std::ofstream也写入