随机实数在 [0.1[ 使用梅森扭曲
Random real in [0..1[ using Mersenne Twister
我正在尝试使用简单的结构在 c++ 中制作僵尸启示录的模型,当我随机化总体时,我需要结构体的某些字段在区间 [0..1[.由于我对统计上更正确的分析感兴趣,因此我选择使用 mt19937 引擎来生成我的"数据"。在玩这个 PRNG 时,我找不到在所述范围内生成数字的方法。这是我想出的代码:
int
main ( int argc, char** argv )
{
mt19937_64 newr ( time ( NULL ) );
std::cout << newr.max ( ) << endl;
std::cout << newr.min ( );
double rn;
for(;;){
rn = newr()/newr.max ();
std::cout << rn << std::endl;
}
}
但是我为循环获得的唯一输出是零 (0)。输出的小字是向下的:
18446744073709551615
0
0
0
0
0
0
0
0
0
0
0
有什么想法吗?
发生这种情况是因为 newr()
和 newr.max()
的返回值是整数,并且 newr()
返回的值小于 newr.mar()
。除法的结果是一个零整数,然后将其转换为double
。要解决此问题,请使用
rn = static_cast<double>(newr()) / newr.max();
您将int
除以int
,因此具有整数舍入。
使用随机引擎的一种方法是通过各种分布之一,在您的情况下std::uniform_real_distribution
:
std::mt19937_64 engine ( time ( NULL ) );
std::uniform_real_distribution<double> dist(0., 1.);
for(;;){
const double rn = dist(engine);
std::cout << rn << std::endl;
}
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将字符随机转换为大写的函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 在C++中随机生成 20 个非重复数字
- 如何在不重新发明轮子的情况下为自定义类型生成均匀分布的随机实数
- 使用boost::random库获取整数随机值而不是实数
- 随机实数在 [0.1[ 使用梅森扭曲
- 生成0到1之间的随机实数