1.4.45 #
解答 #
建立一个布尔数组,将每次随机出来的数作为下标,将相应位置的布尔值改为 true,每次随机都检查一遍这个数组是否都是 true。
代码 #
// HN 指的是调和级数
var random = new Random();
var n = 10000;
var a = new bool[n];
var randomSize = 0;
int times;
for (times = 0; times < 20; times++)
{
for (var i = 0; i < n; i++)
{
a[i] = false;
}
for (var i = 0; true; i++)
{
var now = random.Next(n);
a[now] = true;
if (IsAllGenerated(a))
{
randomSize += i;
Console.WriteLine($"生成{i}次后所有可能均出现过了");
break;
}
}
}
Console.WriteLine($"NHN={n * HarmonicSum(n)},平均生成{randomSize / times}个数字后所有可能都出现");
// 计算 N 阶调和级数的和。
static double HarmonicSum(int n)
{
double sum = 0;
for (var i = 1; i <= n; i++)
{
sum += 1.0 / i;
}
return sum;
}
// 检查所有数字是否都生成过了。
static bool IsAllGenerated(bool[] a)
{
foreach (var i in a)
{
if (!i)
return false;
}
return true;
}