使用Mersenne Twister c++生成数字(0,1)
Generating number (0,1) using mersenne twister c++
我正在努力将R代码实现到C++中,以便它运行得更快,但是我在实现mersenne twister时遇到了困难。我只想生成 (0,1) 之间的值。以下是我与这个问题有关的内容。
#include <random>
std::mt19937 generator (123);
std::cout << "Random value: " << generator() << std:: endl;
我尝试除以RAND_MAX
,但这并没有产生我正在寻找的值。
提前谢谢。
在C++11中,"(伪)随机生成器"和"概率分布"的概念是分开的,这是有充分理由的。
您想要的可以通过以下几行实现:
std::mt19937 generator (123);
std::uniform_real_distribution<double> dis(0.0, 1.0);
double randomRealBetweenZeroAndOne = dis(generator);
如果您想了解为什么这种分离是必要的,以及为什么在发生器的输出上使用标准的除法/范围操作是一个坏主意,请观看此视频。
您可能需要考虑这样的代码:
// For pseudo-random number generators and distributions
#include <random>
...
// Use random_device to generate a seed for Mersenne twister engine.
std::random_device rd{};
// Use Mersenne twister engine to generate pseudo-random numbers.
std::mt19937 engine{rd()};
// "Filter" MT engine's output to generate pseudo-random double values,
// **uniformly distributed** on the closed interval [0, 1].
// (Note that the range is [inclusive, inclusive].)
std::uniform_real_distribution<double> dist{0.0, 1.0};
// Generate pseudo-random number.
double x = dist(engine);
<小时 />有关在C++中生成伪随机数的更多详细信息(包括rand()
不好的原因),请观看Stephan T. Lavavej的视频(来自Go Native 2013):
rand()
被认为是有害的
std::mt19937 不像 rand() 那样在 0 和 RAND_MAX 之间生成,而是在 0 到 2^32-1 之间生成
顺便说一下,该类提供了 min() 和 max() 值!
您需要将值转换为双精度,减去 min() 并除以 max()-min()
uint32_t val;
val << generator;
double doubleval = ((double)val - generator::min())/(generator::max()-generator::min());
或(不太通用)
uint32_t val;
val << generator;
double doubleval = (double)val * (1.0 / std::numeric_limits<std::uint32_t>::max());
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 如何使用Mersenne Twister生成两个数字之间的所有值一次
- 使用Mersenne Twister c++生成数字(0,1)