我必须生成一个随机数列表,它们必须具有给定的平均差异。例如,给定的平均差异为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实现对我也有好处。
答案 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
使用负值,则可以扩大范围,使数字也可以减少。