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 が期待どおりに機能していません。
何か考えはありますか?