小编典典

从范围生成随机整数

all

我需要一个函数,它会在给定范围内生成一个随机整数(包括边界值)。我没有不合理的质量/随机性要求;我有四个要求:

  • 我需要它快。我的项目需要生成数百万(有时甚至是数千万)随机数,而我当前的生成器函数已被证明是一个瓶颈。
  • 我需要它合理统一(使用 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 的比率。

有没有更好的公式?(甚至是整个伪随机数生成器函数?)


阅读 81

收藏
2022-08-15

共1个答案

小编典典

一个快速,比你的更好,但仍然不是正确均匀分布的解决方案是

output = min + (rand() % static_cast<int>(max - min + 1))

除非范围的大小是 2 的幂,否则无论 的质量如何, 此方法都会产生
有偏差的非均匀分布
rand()。有关此方法质量的全面测试,请阅读此

2022-08-15