-2

ランダムな画像を表示する Javascript の小さな関数を作成しました。pics 番号を返す実際の行は次のようになります。

num = Math.floor(Math.random() * RNDGALSIZE);

RNDGALSIZE は現在 = 72 です。

しかし、いくつかの画像はかなり頻繁にヒットし、他の画像はかなりの時間ヒットしないと感じたので、いくつかの回数を生成するループを作成し、各値が出現したnum回数を記録しました。num結果は次のとおりです。

2, 1, 2, 1, 1, 3, 1, 2, 2, 2,    // num = 0 to 9
2, 1, 0, 1, 0, 2, 2, 1, 0, 1,    // num = 10 to 19
1, 2, 0, 1, 0, 0, 1, 1, 2, 1,    // num = 20 to 29
1, 0, 1, 2, 0, 2, 1, 0, 0, 0,    // num = 30 to 39
2, 2, 3, 3, 0, 1, 1, 1, 0, 3,    // num = 40 to 49
2, 1, 2, 1, 3, 2, 3, 2, 1, 1,    // num = 50 to 59
2, 1, 1, 0, 0, 2, 2, 1, 0, 1,    // num = 60 to 69
3, 1                             // num = 70 and 71

ご覧のとおり、値は 3 回以上出現せず、16 個の値はまったく出現しませんでした。一部の値が発生しない場合がありますが、16 は多すぎると思います。私のアプローチに何か問題がありますか?

アップデート:

しばらくして:

4, 4, 3, 6, 5, 5, 3, 3, 2, 2,
2, 2, 2, 2, 3, 5, 3, 1, 4, 2,
4, 3, 0, 1, 1, 0, 1, 4, 4, 4,
2, 0, 5, 3, 0, 4, 2, 0, 2, 1,
2, 3, 4, 3, 2, 4, 3, 2, 0, 5,
4, 4, 4, 2, 3, 4, 4, 4, 5, 1,
2, 2, 4, 2, 0, 3, 4, 2, 2, 1,
4, 1,

ご覧のとおり、3 は 6 回ヒットしていますが、配列にはまだ 7 つのゼロがあります:/

4

3 に答える 3

3

(これは、ロスリーダーの答えを詳しく説明するためのものです。)

試行のp[n][k]後、正確に異なる値 (72 のうち) が現れる確率を とします。正確な閉形式の式を与えるのは難しいですが、動的計画法を使用して非常に簡単に計算できます。nk

var p = [];

p[0] = [];
p[0][0] = 1; // after 0 trials, 100% chance that 0 values have appeared
for(var k = 1; k <= 72; ++k) {
    p[0][k] = 0
}

for(var n = 1; n < 1000; ++n) {
    p[n] = [];
    p[n][0] = 0;
    for(var k = 1; k < n && k <= 72; ++k) {
        p[n][k] = p[n-1][k] * k / 72 + p[n-1][k-1] * (72-k+1) / 72;
    }
    if(n <= 72) {
        p[n][n] = p[n-1][n-1] * (72-n+1) / 72;
    }
    for(var k = n + 1; k <= 72; ++k) {
        p[n][k] = 0;
    }
}

これにより、n試行後に少なくともz「ゼロ」(一度も現れていない値)が残る確率を計算できます。

function probabilityAfterNTrialsOfAtLeastZZeroes(n, z) {
    var ret = 0;
    for(var k = 0; k <= 72 - z; ++k) {
        ret += p[n][k];
    }
    return ret;
}

したがって、91 回の試行の後、まだ 16 個以上の「ゼロ」がある確率はprobabilityAfterNTrialsOfAtLeastZZeroes(91, 16)、つまり 0.959、つまり 96% です。(実際には、あなたがしたのと同じくらい少ないことに少し驚きます: 17 個以上の「ゼロ」を持つ確率は 0.914 であるため、16 以下を持つ確率はわずか 8.6% です。)

同様に、194 回の試行の後、まだ 7 個以上の「ゼロ」がある確率はprobabilityAfterNTrialsOfAtLeastZZeroes(194, 7)、つまり 0.179、つまり 18% です。したがって、通常、194 回の試行の後、7 回未満の「ゼロ」が予想されますが、実験を何度も繰り返すと、ほぼ 5 回に 1 回、7 回以上の「ゼロ」が予想されます。

n試行後に予想される「ゼロ」の数を計算することもできます。

function expectedZeroesAfterNTrials(n) {
    var ret = 0;
    for(var z = 0; z <= 72; ++z) {
        ret += z * p[n][72-z];
    }
    return ret;
}

91 回の試行の後、expectedZeroesAfterNTrials(91)「ゼロ」、つまり 20.164 を期待し、194 回の試行の後、4.775 の「ゼロ」を期待します。

于 2013-07-06T18:05:31.020 に答える
1

あなたの数字はかなり妥当に見えますが、

Math.pow((71/72),194)*72 // odds of missing a number ^ tries * number of slots
4.774719247726743

分数を取得できないため、「決定論的ランダム」の世界に住んでいた場合、「ゼロ」は 7 つではなく 5 つあるはずです。

代わりに、置換なしで選択してから、プールを 0 から再起動する必要があります。

jsconsole から実行できる簡単で汚い 100 テスト カウントを編集します。

function do_test() { x = []; for (var i = 0 ; i < 72 ; i++) x.push(0); for (var j = 0; j < 194; j++) x[Math.floor(Math.random()*72)]++; count = 0; for (var i = 0 ; i < 72 ; i++) if (!x[i]) count++; return count;}


function do_tests(n) { y = []; for (var i = 0; i < n; i++) y.push(do_test()); return y;}

z = do_tests(100)

[5, 5, 3, 6, 4, 3, 2, 4, 3, 3, 4, 5, 2, 5, 5, 3, 7, 3, 3, 4, 6, 4, 7, 4, 3 、7、6、5、8、3、3、4、5、3、3、3、8、3、4、7、8、4、6、3、4、3、4、3、2、7 , 6, 7, 7, 5, 3, 6, 1, 3, 6, 5, 3, 3, 5, 4, 4, 5, 3, 4, 6, 6, 4, 3, 3, 7, 4 、11、6、5、9、5、3、6、7、6、9、2、1、7、3、4、4、6、6、7、7、5、2、5、9、6 ]

j = 0; for (var i = 0; i < 100; i++) j+=z[i];

473 // したがって、4.73 ゼロ スロットは、この 100 回の実行の平均でした...

于 2013-07-06T17:01:25.627 に答える
0

したがって、解決策は、数値がヒットした頻度を追跡し、ランダムジェネレーターが数値にヒットした場合に、すでに頻繁にヒットされている数値を提供することです...</p>

var minhit = Number.MAX_VALUE;
var maxhit = 1;
var index_min = 0;
for (i=0; i<RNDGALSIZE; i++)
{
  if (imgnum[i] < minhit)
  {
    minhit = imgnum[i];
  index_min = i;
  }
  else if (imgnum[i]>maxhit)
  {
    maxhit = imgnum[i];
  }
}
var num = Math.floor(Math.random() * RNDGALSIZE);
if (imgnum[num] == maxhit)
{
  num = index_min;
}
imgnum[num]++;

結果:

2, 2, 1, 2, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 2, 1, 1,
2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
1, 1, 1, 1, 1, 1, 2, 1, 1, 1,
1, 1, 
于 2013-07-06T17:07:44.647 に答える