为什么 Random.NextInt64 创建重复项而不将值分布在整个范围内

问题描述 投票:0回答:1

我编写了一个小型 C# 控制台应用程序来生成一百万个随机长整型

我已经包含了

ThreadLocal
以避免创建重复项

这里如果我正在运行的代码:

var random = new ThreadLocal<Random>(() => new Random());
var numbers = new List<long>();

for (int i = 0; i < 1000000; i++)
{
    numbers.Add(random.Value.NextInt64(1, 999999999999));
}

var metrics = numbers.Select(x => x.ToString().Length).GroupBy(x => x).Select(group => new {
    NumberLength = group.Key,
    Count = group.Count()
}).OrderBy(x => x.NumberLength);

var hashSet = new HashSet<long>();
var duplicates = new List<long>();
foreach (var item in numbers)
{
    if (!hashSet.Add(item))
    {
        duplicates.Add(item);
    }
}

上面的代码正在创建:

  • 2 个重复项
  • 生成的数字似乎都偏向高端

为什么这个开箱即用的 C# 方法会生成重复的“随机”数字,并且不会将长数分布在整个范围内?

c# random long-integer
1个回答
0
投票

由于生日悖论,即使对于理想均匀分布的随机数,这也是预期的。

维基百科页面上有一个公式,对于给定的d

不同的状态/天,采取多少随机措施
n
才能有50%的碰撞机会:

d == 999 999 999 999

 的示例中,公式给出 
n(d) ~= 1 177 410
,碰撞的可能性为 50%。而且您的 
1 000 000
 与计算出的 
n(d)
 非常接近,因此在您的情况下,碰撞的可能性略低于 50%,这仍然是很有可能的。

© www.soinside.com 2019 - 2024. All rights reserved.