c# - 随机不是那么随机

标签 c# .net random

<分区>

我正在使用 Random 生成一个随机数序列。我只构建一次随机对象,然后在循环中生成随机值(其中 300 个)。问题是,一旦我获得所有值并对它们进行排序,我就会意识到其中一些值是相等的和/或顺序的:我正在生成从 0 到 50000 的数字。

这是我的脚本:

Random rnd = new Random();
for (int n=0; n < 300; n++)
{
    int RndNumber = rnd.Next(0, 50000);
    System.Threading.Thread.Sleep(3);
}

有人可以知道为什么会发生这种情况吗?我该如何改进它以使其更加随机?

最佳答案

所以这就是生日悖论*。当您从 50000 中抽取 300 个数字时,其中至少有两个数字相等的近似概率是

p(300) = 1 - exp(-300 * 300 / (2 * 50000))
       = 0.59

(我可以计算出确切的概率,但我很懒!。)

因此,发生碰撞的可能性更大。顺序更有可能(现在你不需要碰撞,你只需要 n - 1nn n + 1 被击中一些 n)。

随机是善变的。

*:如果你不熟悉的话,它说如果你在一个房间里有二十三个人,那么很可能至少有两个人在房间里同一天生日。

!:好的,我解决了。这是 0.5953830515549951746819986449....

关于c# - 随机不是那么随机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4858790/

相关文章:

c# - 使用 monomac/c# 实例化一个附加窗口

c# - Linq 选择字符串值 "not equals"忽略 DB 空值

.net - 在 .net 中强制继承

c# - linq to sql,进行一个数据库调用而不是三个

c++ - 随机打印出每个字符

python - 如何选择范围内的随机数 - + 转换为 ms

c# - 如何在管理 MVC 4 应用程序中重用模型和 View 进行添加和编辑

c# - SyndicationFeed AttributeExtensions 命名空间前缀

c++ - 如何使用正态分布生成最小值和最大值之间的整数?

javascript - jQuery API 调用 Entity Framework API Put 方法