我需要一个函数,它会在给定范围内生成一个随机整数(包括边界值)。我没有不合理的质量/随机性要求;我有四个要求:
我目前有以下 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 的比率。
有没有更好的公式?(甚至是整个伪随机数生成器函数?)
一个快速,比你的更好,但仍然不是正确均匀分布的解决方案是
output = min + (rand() % static_cast<int>(max - min + 1))
除非范围的大小是 2 的幂,否则无论 的质量如何, 此方法都会产生 有偏差的非均匀分布数rand()。有关此方法质量的全面测试,请阅读此。
rand()