2

我必须生成一个随机数列表,并且它们必须具有给定的平均差异。例如,给定的平均差为 10,因此这些数字很好:1 3 5 9 15 51. 我所做的是将给定的平均差乘以 2 并加 1。像这样:

    while (i <= 50000)
    {
        i += Math.random() * givenAverageDiff * 2 + 1;
        list.add(i);
    }

但我从来没有得到5000或更多。事实上,它总是 4,850 或更少。为什么?假设givenAverageDiff是10。我的错误是什么?我该如何解决?

用 C 或 PHP 实现 PS 对我也有好处。

4

2 回答 2

1

因为你正在做“+ 1”。

让我们计算预期差异:

E(2*10*x+1)= 2*10*E(x)+1 = 2*10*0.5+1 = 10+1。因此,平均而言,您将获得 50000/11 个数字。

您需要选择期望值等于 10 的值。将其更改为以下内容,它应该可以工作:

while (i <= 50000)
    {
        i += Math.random() * (givenAverageDiff-1) * 2 + 1;
        list.add(i);
    }
于 2013-04-22T18:17:16.827 回答
1

根据您创建的范围来考虑它。根据您目前的计算,

i += Math.random() * givenAverageDiff * 2 + 1;

givenAverageDiff您正在为您的号码添加 1 到 2* 。1 到 2x 的总和是 (2x)(2x+1)/2,由于有 2x 选项,我们除以 2x 得到 (2x)(2x+1)/(2*2x) = (2x+1) /2 = x + 0.5。

所以你想要的是有 2x+1 个选项,使用 [0,2*x] 的范围是最简单的。您可以通过添加括号来获得:

i += Math.random() * (givenAverageDiff * 2 + 1);

如果您希望它始终增加,那么您要么需要使用非均匀分布,要么需要使用具有较小范围的均匀分布。要获得范围 [n,2*xn],请使用

i += Math.random() * ((givenAverageDiff - n) * 2 + 1) + n;

如果您使用负值,n您可以扩大范围,使数字也可以减少。

于 2013-04-22T18:34:53.130 回答