我编写了一个小型 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);
}
}
上面的代码正在创建:
为什么这个开箱即用的 C# 方法会生成重复的“随机”数字,并且不会将长数分布在整个范围内?
由于生日悖论,即使对于理想均匀分布的随机数,这也是预期的。
维基百科页面上有一个公式,对于给定的d
不同的状态/天,采取多少随机措施
n
才能有50%的碰撞机会:在
d == 999 999 999 999
的示例中,公式给出
n(d) ~= 1 177 410
,碰撞的可能性为 50%。而且您的
1 000 000
与计算出的
n(d)
非常接近,因此在您的情况下,碰撞的可能性略低于 50%,这仍然是很有可能的。