【问题标题】:Generating the list of random numbers with certain average difference生成具有一定平均差的随机数列表
【发布时间】:2013-04-22 17:19:23
【问题描述】:

我必须生成一个随机数列表,并且它们必须具有给定的平均差。例如,给定的平均差值为 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 实现对我也有好处。

【问题讨论】:

  • 什么是“平均差”?
  • 我想知道是否有类型转换搞砸了。我假设iintgivenAverageDiffint 还是 double
  • @Eddy_Em 我认为这意味着 M 项的序列正在增加,并且 (i_n+1 - i_n) 的总和对于 n=0 到 M-1 = (avg_difference) * (M- 1)。我看不出你怎么能保证这一点,同时又能保持随机性。
  • 我刚刚尝试运行这个循环,它对我来说运行得很好。你能告诉我们更多的背景吗?
  • 运行正常,但结果不正确。它没有正确的平均差。

标签: java php c algorithm random


【解决方案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);
    }

【讨论】:

    【解决方案2】:

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

    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 使用负值,则可以扩大范围,从而使数字也可以减少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多