2

重複の可能性:
ランダムな範囲を1–5から1–7に拡張します

私はここで質問を見ました:リンク

著者が提供した解決策は、同じ確率を生み出すようには見えませんでした。

たとえば、関数の10k回の呼び出しのうち4番目の数値が1〜2回返されました(2などの他の数値がそれぞれ約2k回返された場合)。

たぶん私は間違って理解したか、アルゴリズムを間違って書いたのかもしれませんが、ここでは:

    static int rand5()
    {
        return new Random().Next(1, 6);
    }
    static int rand7()
    {
        while (true)
        {
            int num = 5 * (rand5() - 1) + rand5();
            if (num < 22) return ((num % 7) + 1);
        }
    }
    static void Main(string[] args)
    {
        int limit = 10000;
        int[] scores = new int[7];
        for (int i = 0; i < limit; i++)
        {
            scores[rand7() - 1]++;
        }
        foreach (int n in scores)
        {
            Console.Write(n + " ");
        }
        Console.WriteLine();
    }

前もって感謝します。

4

1 に答える 1

2

Rand5では乱数を生成していません。

このようにしてください:

static Random rand = new Random()
static int rand5()
{
    return rand.Next(1, 6);
}
于 2012-05-05T17:47:14.183 に答える