这相当于 Adam Rosenfield 的解决方案,但对于某些读者来说可能更清楚一些。它假设 rand5() 是一个返回 1 到 5(含)范围内的统计随机整数的函数。
int rand7()
{
int vals[5][5] = {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 1, 2, 3 },
{ 4, 5, 6, 7, 1 },
{ 2, 3, 4, 5, 6 },
{ 7, 0, 0, 0, 0 }
};
int result = 0;
while (result == 0)
{
int i = rand5();
int j = rand5();
result = vals[i-1][j-1];
}
return result;
}
它是如何工作的?可以这样想:想象一下在纸上打印出这个二维数组,将其粘在飞镖板上并随机向其投掷飞镖。如果您达到非零值,则它是 1 到 7 之间的统计随机值,因为有相同数量的非零值可供选择。如果你击中了零,就继续扔飞镖,直到你击中非零。这就是这段代码的作用:i 和 j 索引随机选择飞镖板上的一个位置,如果没有得到好的结果,我们就继续扔飞镖。
就像 Adam 所说,在最坏的情况下这可以永远运行,但从统计上看,最坏的情况永远不会发生。 :)