-1

次のコードは、バイアスの有無にかかわらず乱数を生成しますか?

    int numberToGenerate = 20;
    int rangeUpperLimit = 30;
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

    for (int i = 0; i < numberToGenerate; i++) {
        int randomInt = random.nextInt(rangeUpperLimit); 
        // Do something with it.
    }        

値は、長さ30、つまり0〜29の範囲charsから選択するために使用されます。String値を選択するコードcharは、質問とは関係がないため省略されています。

4

2 に答える 2

3

それは確かに一様分布であることを意味します(したがってバイアスなし)。ドキュメントから:

この乱数ジェネレーターのシーケンスから抽出された、0(包括的)と指定された値(排他的)の間の疑似ランダムで均一に分散されたint値を返します。

これは、ジェネレータシーケンスが適切であることを前提としていますが、特に次のドキュメントを考慮すると、ここで行うのは妥当な前提だと思いますSecureRandom

暗号的に強力な乱数は、FIPS 140-2、暗号化モジュールのセキュリティ要件、セクション4.9.1で指定されている統計的乱数ジェネレーターテストに最小限準拠しています。

バイアスが心配な場合は、特定の実行を確認するのはかなり簡単です。たとえば、3,000万の値を生成し、各数値を取得した回数を追跡し、バケットあたり100万にどれだけ近いかを確認します。 。

于 2012-10-22T06:30:21.283 に答える
-1

ドキュメントからの定義では、結果十分に均一である必要がありますが、この例では、PNRGを初期化するためにシードを使用していないため、バイアスがかかる可能性があります。

于 2012-10-22T06:29:43.557 に答える