0

using ブロック内で C# RNGCryptoServiceProvider を使用しています

byte[] values = new byte[ammountToCreate];


using (RNGCryptoServiceProvider randomizer = new RNGCryptoServiceProvider())
{
   randomizer.GetBytes(values);
}

その後、結果値は間隔 [0:15] に正規化されるため、モジュロ バイアスが出力に影響を与えることはありません。

正規化は次のように行われます。

byte n = (byte)(this.maxRandomValue + 1);

// loop all element in the input value, an apply modulo.
for (int i = 0; i < values.Length; i++)
{
  values[i] = (byte)(values[i] % n);
}

ここで、maxRandomValue は 15 です。

ただし、最初のテストから、出力は均一ではないようです。2916 個の数値を生成しました。これが値の分布です。

+-------+--------------+
| Value | % On Total   |
+-------+--------------+
|     0 | 6.52%        |
|     1 | 5.90%        |
|     2 | 6.10%        |
|     3 | 6.34%        |
|     4 | 5.73%        |
|     5 | 6.89%        |
|     6 | 5.49%        |
|     7 | 6.86%        |
|     8 | 5.66%        |
|     9 | 5.97%        |
|    10 | 6.58%        |
|    11 | 6.04%        |
|    12 | 6.48%        |
|    13 | 5.97%        |
|    14 | 7.17%        |
|    15 | 6.31%        |
+-------+--------------+

ご覧のとおり: 6 --> 生成された数値の 5.49% 14 --> 生成された数値の 7.17%

私が恐れているのは、生成した数がほんのわずかで、ボリュームが大きくなると分布が均一になるのではないかということです。または、using 内の RNGCryptoServiceProvider が期待どおりに機能していません。

何か考えはありますか?

4

0 に答える 0