さて、私は以下の方法をテストしました。
生成さ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;
}