我在 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 未按预期工作。
你有什么主意吗?