好吧,我测试了下面的方法。
生成x
时间之间的随机数0~x
,然后检查未生成的随机数。
我认为这将非常接近 100%。我的意思是0~x
生成之间的所有数字。
但结果令人震惊。大约36%的数字丢失了。
我的随机函数不是真的随机吗?
在我的随机课程下面:
private static Random seedGenerator = new Random();
private static ThreadLocal<Random> random =
new ThreadLocal<Random>(SeededRandomFactory);
private static Random SeededRandomFactory()
{
lock (seedGenerator)
return new Random(seedGenerator.Next());
}
public static int GenerateRandomValueMin(int irRandValRange, int irMinValue)
{
return random.Value.Next(irMinValue, irMinValue + irRandValRange);
}
以下是结果:
在 0-10 之间,缺失数字计数:4,百分比:40% 在 0-100 之间,缺失数字计数:36,百分比:36% 在 0-1000 之间,缺失数字计数:369,百分比:36.9% 在 0-10000 之间,缺失数字计数:3674,百分比:36,74% 在 0-100000 之间,缺失数字计数:36583,百分比:36,58% 在 0-1000000 之间,缺失数字计数:367900,百分比:36,79% 在 0-10000000 之间,缺失数字计数:3678122,百分比:36,78% 在 0-100000000 之间,缺失数字计数:36797477,百分比:36.8%
这是我如何检查的代码:
File.WriteAllText("results.txt", "");
int irFirst = 10;
for (int i = 0; i < 8; i++)
{
HashSet<int> hsGenerated = new HashSet<int>();
for (int k = 0; k < irFirst; k++)
{
hsGenerated.Add(GenerateRandomValue.GenerateRandomValueMin(irFirst, 0));
}
int irNotFound = 0;
for (int k = 0; k < irFirst; k++)
{
if (hsGenerated.Contains(k) == false)
irNotFound++;
}
string srSonuc =
string.Format(
"Between 0-{0}, missing numbers count: {1}, percent: {2}%",
irFirst, irNotFound,
Math.Round((Convert.ToDouble(irNotFound)/Convert.ToDouble(irFirst))*100.0, 2).ToString()
);
using (StreamWriter w = File.AppendText("sonuclar.txt"))
{
w.WriteLine(srSonuc);
}
irFirst = irFirst * 10;
}