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 внутри использования не работает должным образом.

Есть ли у вас какие-либо идеи?

0 ответов

Другие вопросы по тегам