0

Java で宝くじシミュレーターを作成しようとしていますが、生成された数字が十分にランダムかどうかが気になり始めています。

たとえば、繰り返しのない白いボール番号を生成するコードは次のようになります。

public static int[] genWhiteNums()
{
    int[] whitePicks = new int[5];
    Collections.shuffle(whiteDrawNums); //whiteDrawNums is an arraylist of numbers 1-59

    for(int i = 0; i < 5; i++)
    {
        whitePicks[i] = whiteDrawNums.get(i);
    }
    whiteDrawNums = createWhiteNums(); //Reordering

    return whitePicks;
}

Collections.shuffle から最初の 5 つの値を選択するのは十分にランダムですか?

4

3 に答える 3

3

ここのドキュメントによると

デフォルトの乱数ソースを使用して、指定されたリストをランダムに並べ替えます。すべての順列は、ほぼ同じ確率で発生します。

ヘッジ「ほぼ」が前述の説明で使用されているのは、乱数のデフォルトのソースが独立して選択されたビットのほぼバイアスのないソースにすぎないためです。それがランダムに選択されたビットの完全なソースである場合、アルゴリズムは完全に均一な順列を選択します。

線形時間シャッフル アルゴリズムを使用します。ほとんどの人のニーズを満たすのに十分ランダムだと思います。

于 2013-05-24T18:06:54.380 に答える
2

Collections.shuffle はFisher-Yates shuffle を行います。それが十分にランダムである場合、それはあなたの考慮事項です

于 2013-05-24T18:05:06.847 に答える
0

Random#nextInt()シャッフルされたコレクションから十分に分散されたランダム値を選択するために使用します。

public static int[] genWhiteNums() {
    Random random = new Random();

    int[] whitePicks = new int[5];
    Collections.shuffle(whiteDrawNums);  // Arraylist 1-59

    for (int i = 0; i < whitePicks.length; i++) {
        whitePicks[i] = whiteDrawNums.get(
                        random.nextInt(i != 4 ? 12 : 11) + 12 * i);
    }

    whiteDrawNums = createWhiteNums(); // Reordering
    return whitePicks;
}

使用可能なインデックス (0 ~ 58) を 12 の 4 つのグループと 11 の最後のグループに分割し、ループの反復ごとにランダムなインデックスを 1 つ選択します。これは、ランダム性の必要性を十分に満たすはずです。

于 2013-05-24T20:08:46.353 に答える