23

これを他にどのように説明するかわからないので、タイトルはほとんど問題を説明しています。

ランダムは、ループのすべての部分で再初期化されているわけではありません。これは、私が常に他のクラスから呼び出すクラスの静的メンバーです。

カスタムシードを使用していません。

初期化コードは次のとおりです。

    public static Random random = new Random();

        for (int x = 0; x < 75; x++)
        {
            if (main.random.Next(11) == 1)
            {
                tiles[heightMap[x] - 1][x] = 4;
                tiles[heightMap[x] - 2][x] = 4;
                tiles[heightMap[x] - 3][x] = 4;
                tiles[heightMap[x] - 4][x] = 4;
                tiles[heightMap[x] - 5][x] = 4;
                tiles[heightMap[x] - 5][x - 1] = 5;
                tiles[heightMap[x] - 6][x - 1] = 5;
                tiles[heightMap[x] - 6][x] = 5;
                tiles[heightMap[x] - 5][x + 1] = 5;
                tiles[heightMap[x] - 6][x + 1] = 5;
            }
        }

これ(これは素晴らしい方法ではないことを私は知っています-それは初歩的で一時的なものです)はツリーを生成します。

ただし、私の地形は、多くのクラスター化された木があり、次のように見えることがよくあります。

☁☁☁☁☁☁☁☁☁☁

なぜこれが起こっているのかについて誰かが洞察を与えることができますか?System.Security.Cryptography.Randomクラスを使用するよりも優れた代替手段はありますか?

ツリーごとに平均9つのギャップがあると思いますが、7つ、次に3つのツリーが密集しているようなものです。

ここに画像の説明を入力してください

4

1 に答える 1

35

これは確率の誤解です。あなたが知っているのは、どの時点でも、次のスロットでツリーを取得する可能性は、一様分布を仮定すると、11分の1であるということです。

したがって、ギャップが0になる可能性は1/11です。

したがって、ギャップが1になる可能性は10/11*1/11です。

したがって、ギャップが2になる可能性は、10/11 * 10/11*1/11です。

それらすべての10/11は(まあ、乗算)加算します!それでは、ユーティリティを書いてみましょう。

decimal accountedFor = 0M;
for (int i = 0; i <= 20; i++)
{
    decimal chance = 1M / 11M;
    for (int j = 0; j < i; j++) chance *= 10M / 11M;
    accountedFor += chance;
    Console.WriteLine("{0:00}: {1:00.0%}\t({2:00.0%})", i, chance, accountedFor);
}

これは次のようになります。

00: 09.1%       (09.1%)
01: 08.3%       (17.4%)
02: 07.5%       (24.9%)
03: 06.8%       (31.7%)
04: 06.2%       (37.9%)
05: 05.6%       (43.6%)
06: 05.1%       (48.7%)
07: 04.7%       (53.3%)
08: 04.2%       (57.6%)
09: 03.9%       (61.4%)
10: 03.5%       (65.0%)
11: 03.2%       (68.1%)
12: 02.9%       (71.0%)
13: 02.6%       (73.7%)
14: 02.4%       (76.1%)
15: 02.2%       (78.2%)
16: 02.0%       (80.2%)
17: 01.8%       (82.0%)
18: 01.6%       (83.6%)
19: 01.5%       (85.1%)
20: 01.4%       (86.5%)

これは、小さなギャップのバイアスを説明しています。ノート; サイズ20のギャップに達するまでに、1.5%未満の確率領域に入り、考えられるすべての結果の85%を占めています。残りの15%は、残りの無限大に分散されます(つまり、ギャップサイズ13212の可能性はありますが、ほとんどありません)。

シミュレーションは次のとおりです。

int[] gapCounts = new int[21];

int gap = 0;
// simulate a few gaps using your algo
var random = new Random();
for (int x = 0; x < 100000; x++)
{
    if (random.Next(11) == 1)
    { // count that gap
        gapCounts[gap]++;
        gap = 0;
    }
    else
    {
        gap++;
        if(gap >= gapCounts.Length)
        { // just skip anything too large, sorry
            gap = 0;
        }
    }
}

decimal total = gapCounts.Sum();
for(int i = 0 ; i < gapCounts.Length ; i++)
{
    Console.WriteLine("{0:00}: {1:00.0%}", i, gapCounts[i] / total);
}

これらの値が実行ごとに変更されることは何も出力されません。

00: 11.0%
01: 09.4%
02: 08.6%
03: 07.9%
04: 07.3%
05: 06.5%
06: 05.4%
07: 05.4%
08: 04.7%
09: 04.5%
10: 04.4%
11: 03.4%
12: 03.5%
13: 03.0%
14: 02.9%
15: 02.4%
16: 02.5%
17: 02.2%
18: 01.9%
19: 01.5%
20: 01.7%
于 2012-04-28T21:27:38.220 に答える