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%

我担心的是,也许我只生成了很少的数字,并且随着数量的增加,分布变得均匀。或者,使用中的 RNGCryptoServiceProvider 未按预期工作。

你有什么主意吗?

4

0 回答 0