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 以下です。なんで?10 だとしましょうgivenAverageDiff。私の間違いは何ですか? どうすれば修正できますか?

CまたはPHPでのPS実装も私にとっては良いことです。

4

2 に答える 2

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。

したがって、[0,2*x] の範囲を使用すると最も簡単な 2x+1 オプションが必要になります。括弧を追加することでそれを得ることができます:

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

常に増加させたい場合は、不均一な分布を使用するか、範囲が狭い均一な分布を使用する必要があります。範囲 [n,2*xn] を取得するには

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

負の値を使用するとn、範囲を広げることができ、数値も減少させることができます。

于 2013-04-22T18:34:53.130 に答える