gpt4 book ai didi

c# - Random.Next() 有多随机?

转载 作者:可可西里 更新时间:2023-11-01 08:50:23 24 4
gpt4 key购买 nike

我一直在对 Random 类进行一些测试,我使用了以下代码:

while (x++ <= 5000000)
{
y = rnd.Next(1, 5000000);
if (!data.Contains(y))
data.Add(y);
else
{
Console.WriteLine("Cycle {2}: Repetation found for number {0} after {1} iteration", y, x, i);
break;
}
}

我不断更改 rnd 最大限制(即 5000000)并更改迭代次数,我得到以下结果:

1) if y = rnd.Next(1, 5000) : The average is between 80 to 110 iterations
2) if y = rnd.Next(1, 5000000) : The average is between 2000 to 4000 iterations
3) if y = rnd.Next(1, int.MaxValue) : The average is between 40,000 to 80,000 iterations.

为什么我得到这些平均值,即在我检查每个值的 10 次中,80% 的时间我都在这个平均值范围内。我不认为我们可以称之为接近随机。

我该怎么做才能得到一个相当随机的数字。

最佳答案

您不是在测试循环。您正在测试获得以前拥有的随机数需要多长时间。那是完全不同。您的数字非常适合测试获得您之前拥有的随机数需要多长时间。在维基百科的“生日悖论”下查看经过一定次数的迭代后发生碰撞的概率图表。

巧合的是,上周我写了一篇关于这个主题的博客文章。它将于 3 月 22 日上线; see my blog然后查看详情。

如果您要测试的是伪随机数生成器的周期长度,那么您需要寻找的不是您以前拥有的数字,而是您以前拥有的冗长的精确数字序列。有许多有趣的方法可以做到这一点,但我可能更容易告诉你:Random 的周期长度是几十亿,所以你不太可能编写一个程序来发现这个事实。您必须存储很多的数字。

但是,周期长度并不是衡量伪随机数生成器质量的唯一指标。请记住,PRNG 不是随机的,它们是可预测的,因此您必须非常仔细地考虑您的“随机性”指标是什么。

给我们更多细节:你为什么关心 Random 有多“随机”?您将它用于您关心的什么应用程序?随机性的哪些方面对您很重要?

关于c# - Random.Next() 有多随机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2334811/

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