已知一个函数f可以等概率的得到1-5间的随机数,问怎么等概率的得到1-7的随机数。
----
连续调用函数f两次,就能得到5*5=25种可能的组合串;抛弃最后的四个组合串,就有21中可能性,正好是7的倍数。
php的简陋实现如下:
<?php function rand5to7 ($p) { switch ($p) { case '11': case '12': case '13': return 1; break; case '14': case '15': case '21': return 2; break; case '22': case '23': case '24': return 3; break; case '25': case '31': case '32': return 4; break; case '33': case '34': case '35': return 5; break; case '41': case '42': case '43': return 6; break; case '44': case '45': case '51': return 7; break; case '52': case '53': case '54': case '55': return false; break; } } function rand7 () { while (true) { $a = rand(1, 5); $b = rand(1, 5); $random = rand5to7($a.$b.""); if ($random) { return $random; break; } } } $array = array(); $i = 700000; while ($i -- > 0) { $ext = rand7(); $array["key$ext"] ++; } ksort($array); echo print_r($array);
结果:
vxx:~/jeff # php c.php Array ( [key1] => 100257 [key2] => 99922 [key3] => 99595 [key4] => 100063 [key5] => 100088 [key6] => 100194 [key7] => 99881 )