gpt4 book ai didi

c# - Math.NET CryptoRandomSource Next 是有偏见的

转载 作者:行者123 更新时间:2023-11-30 23:21:56 24 4
gpt4 key购买 nike

我正在开发一个受到严格监管审查的游戏平台。我选择 Math.NET 是因为它看起来很合适。然而,我刚刚从我们的审计员那里收到了这条评论。

请评论这是否准确以及如何解决?


在RandomSource()中,Next(int, int)定义如下:

    public override sealed int Next(int minValue, int maxValue)
{
if (minValue > maxValue)
{
throw new ArgumentException(Resources.ArgumentMinValueGreaterThanMaxValue);
}

if (_threadSafe)
{
lock (_lock)
{
return (int)(DoSample()*(maxValue - minValue)) + minValue;
}
}

return (int)(DoSample()*(maxValue - minValue)) + minValue;
}

这会以与之前相同的方式产生偏差。使用 RNG 中未缩放的值并将其乘以范围而不事先消除偏差(除非范围是 2 的幂,否则将存在偏差)。

最佳答案

更新:Next(minInclusive, maxExclusive) 的实现已在 Math.NET Numerics v3.13 中更改如下这个讨论。从 v3.13 开始,它不再涉及 float ,而是根据需要使用尽可能多的位数对整数进行采样以支持请求的范围(2 的幂)并拒绝实际范围之外的那些。这样它就避免了在字节采样本身之上添加任何偏差(例如由加密 RNG 提供)

假设:DoSample() 返回 [0,1)( double float )范围内的均匀分布样本。

将它与范围 R=max-min 相乘将导致在 [0,R) 范围内均匀分布的样本。将其转换为一个整数(本质上是一个底数)将导致 0,1,2,...,R-1 之一的均匀分布的离散样本。我看不出 R 是偶数、奇数或 2 的幂这一事实会在何处影响这一步中的偏差。

计算 100'000'000 个样本的几次运行也没有表明明显的偏差,但这当然不是证据:

var r = new CryptoRandomSource();
long[] h = new long[8];
for (int i = 0; i < 100000000; i++)
{
h[r.Next(2,7)]++;
}

0
0
19996313
20001286
19998092
19998328
20005981
0

0
0
20000288
20002035
20006269
19994927
19996481
0

0
0
19998296
19997777
20001463
20002759
19999705
0

关于c# - Math.NET CryptoRandomSource Next 是有偏见的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39013455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com