生成0到1之间的随机实数
Boost C++ - generating a random real number between 0 and 1
我一直在阅读Boost c++文档,并试图找出如何生成0和1之间的随机实数,使用库的uniform_01
部分。有人有什么建议吗?
根据建议,我使用这段代码,但它每次生成相同的随机值。
double random01(mt19937 & generator)
{
uniform_01<mt19937> dist(generator);
return dist();
}
int main()
{
mt19937 generator(time(0));
for (int i = 0; i < 10; i++) {
cout << random01(generator) << endl;
}
return 0;
}
抱歉,如果我没有说清楚;这个问题解决不了,不管是我的答案还是其他人的答案。它每次仍然生成相同的随机值
这段代码中有几个'gotcha':
-
random01()
函数不引用生成器,而是获取生成器的副本。因此,如果您使用同一个生成器多次调用该函数-它将一次又一次地产生相同的值! -
random01()
中的static
uniform_01
仅在第一次调用random01时初始化,因此,如果使用不同的生成器调用它,它将不使用它,而是使用对第一个生成器的引用,甚至可能已被销毁,因为!
正确的是如下所示(注意参数列表中的&
,用于引用传递,并且缺少static
:
double random01(mt19937 & generator)
{
uniform_01<mt19937> dist(generator);
return dist();
}
这是我找到的解决方案:
#include <iostream>
#include <ctime>
#include <boost/random.hpp>
using std::cout;
using std::endl;
using boost::mt19937;
using boost::uniform_01;
double random01(mt19937 generator)
{
static uniform_01<mt19937> dist(generator);
return dist();
}
int main()
{
mt19937 generator(time(0));
cout << random01(generator) << 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之间的随机实数