在 java 中生成随机数,使其平均为特定值

Generating random numbers in java such that they average to a particular value

我正在考虑为这个随机数生成器使用指数分布,如果我生成大约 100 个数字,它应该平均到一个特定的值,比如 7.5。我该怎么做?

如果您选择的分布有一些参数值,请选择它们以使您的分布具有 7.5 的预期值

使用指数分布 a*e^(-a*x) 您必须选择 a 作为 1 / 7.5

Apache Commons MathExponentialDistribution class ,你可以实例化传递给它的意思,这可能是你正在寻找的,但需要注意的是,你画的数字越多,离你越近会达到你的平均值。

如果您希望期望值为 7.5,只需使用外部库函数或实现您自己的 inverse transform routine.

以 1/7.5 的比率生成指数

如果你想让100个值的平均值正好是7.5,你可以玩一些有趣的游戏来实现。要得到 100 个事物的平均 7.5,它们的总和必须是 750。事实证明,将 N 个点均匀分布在范围 R 上会产生速率为 N/R 的泊松过程,并且泊松出现次数之间的距离呈指数分布以同样的速度。这导致以下(并且相对简单)算法:

  1. 创建一个长度为 101 的数组 poisson,其中包含值 0 和 750。
  2. 通过生成 99 个在 0 到 750 之间均匀分布的附加数字来填充数组的其余部分。
  3. 对数组进行排序。
  4. i = 1,...,100 的输出 poisson[i] - poisson[i-1]

我的 Java 生疏了,所以我用不同的语言实现了它,但这里是用统计包 JMP 分析时的结果:


这是我在 Ruby 中的实现,如果您有兴趣,它实际上是伪代码。应该很容易转换为 Java.

N = 100
TARGET_MEAN = 7.5

total = N * TARGET_MEAN
poisson = [0, total]
(N - 1).times { poisson << rand(0.0..total) }
poisson.sort!
(1...poisson.length).each { |i| p poisson[i] - poisson[i-1] }