我需要一个函数,它可以生成给定范围(包括边界值)内的随机整数。我没有不合理的质量/随机性要求;我有四个要求:
- 我需要它快点。我的项目需要生成数百万(有时甚至数千万)的随机数,而我当前的生成器函数已被证明是一个瓶颈。
- 我需要它相当均匀(使用 rand() 非常好)。
- 最小-最大范围可以是 到 之间的任何值。
- 它必须是可播种的。
我目前有以下 C++ 代码:
output = min + (rand() * (int)(max - min) / RAND_MAX)
问题是它并不真正统一 -max仅当 rand() = RAND_MAX 时返回(对于 Visual C++,为 1/32727)。对于像 这样的小范围来说,这是一个主要问题,其中最后一个值几乎不会返回。
所以我拿起笔和纸,想出了以下公式(它基于 (int)(n + 0.5) 整数舍入技巧):
但它仍然没有给我一个统一的分布。重复运行 10000 个样本,得出值 -1、0. 1 的比率为 37:50:13。
有更好的公式吗? (或者甚至整个伪随机数生成器函数?)
最简单(也是最好的)C++(使用 2011 年标准)答案是:
#include <random>
std::random_device rd; // Only used once to initialise (seed) engine
std::mt19937 rng(rd()); // Random-number engine used (Mersenne-Twister in this case)
std::uniform_int_distribution<int> uni(min,max); // Guaranteed unbiased
auto random_integer = uni(rng);
无需重新发明轮子、担心偏差或担心使用时间作为随机种子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)