生成具有一定平均差异的随机数列表

时间:2013-04-22 17:19:23

标签: java php c algorithm random

我必须生成一个随机数列表,它们必须具有给定的平均差异。例如,给定的平均差异为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.我的错是什么?我该如何解决?

P.S。用C或PHP实现对我也有好处。

2 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:1)

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

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

您要为您的号码添加1到2 * givenAverageDiff。 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 * x-n],请使用

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

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