function rand7()
{
$vals = array(
array( 1, 2, 3, 4, 5 ),
array( 6, 7, 1, 2, 3 ),
array( 4, 5, 6, 7, 1 ),
array( 2, 3, 4, 5, 6 ),
array( 7, 0, 0, 0, 0 )
);
$result = 0;
while ($result == 0)
{
$i = rand5();
$j = rand5();
$result = $vals[$i-1][$j-1];
}
return $result;
}
这种算法非常地巧妙。 先人工构造一个5*5的数组,其中非0的数字(1~7)各出现3次,然后从中随机的抽出一个非0数。 1~7中任一个数被抽中的概率都是3/21=1/7,所以是一个合格的随机数生成器。
然后可以推广到更一般的情况,randn->randn_k,利用n*n数组,然后先填上(n+k)*[n*n/n+k]个非0数,剩余位置填0.
