RNGCryptoServiceProvider Нормализованное распределение значений
Я использую 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% сгенерированных чисел
Я боюсь, что, возможно, я сгенерировал всего несколько цифр, и с большими объемами распределение станет равномерным. Или, RNGCryptoServiceProvider внутри использования не работает должным образом.
Есть ли у вас какие-либо идеи?