我需要一个函数,它会在给定范围内生成一个随机整数(包括边界值)。我没有不合理的质量/随机性要求;我有四个要求:
- 我需要它快。我的项目需要生成数百万(有时甚至是数千万)随机数,而我当前的生成器函数已被证明是一个瓶颈。
- 我需要它合理统一(使用 rand() 非常好)。
- 最小-最大范围可以是从 <0, 1> 到 <-32727, 32727> 的任何值。
- 它必须是可播种的。
我目前有以下 C++ 代码:
output = min + (rand() * (int)(max - min) / RAND_MAX)
问题是它并不是真正统一的——只有当 rand() = RAND_MAX 时才返回 _最大值_(对于 Visual C++,它是 1/32727)。对于像 <-1, 1> 这样的小范围来说,这是一个主要问题,其中最后一个值几乎从不返回。
所以我拿起笔和纸,想出了以下公式(它建立在 (int)(n + 0.5) 整数舍入技巧的基础上):
但它仍然没有给我一个均匀的分布。使用 10000 个样本重复运行给我 37:50:13 的值 -1、0. 1 的比率。
有没有更好的公式? (甚至是整个伪随机数生成器函数?)
原文由 Matěj Zábský 发布,翻译遵循 CC BY-SA 4.0 许可协议
一个快速,比你的更好,但仍然不是正确均匀分布的解决方案是
除非范围的大小是 2 的幂,否则无论
rand()
的质量如何, 此方法都会产生 有偏差的非均匀分布 数。有关此方法质量的全面测试,请 阅读此。