随机数是不是均匀分布,实践来说话: <?php function testRand($randFunction, $groupsNumber = 10, $rollsNumber = 200) { $frequencies = array_fill(0, $groupsNumber, 0); foreach (range(1, $rollsNumber) as $ignored) { if ($randFunction == 'lcg_value') { $frequencies[$randFunction() * 10]++; } else { $frequencies[$randFunction(0, $groupsNumber - 1)]++; } } echo PHP_EOL, "------- results for `$randFunction` -------", PHP_EOL; $cum = 0; foreach ($frequencies as $index => $frequency) { $percent = $frequency * 100 / $rollsNumber; $cum += $percent; echo sprintf("%d\t|\t%4d\t%6.2f\t%6.2f", $index, $frequency, $percent, $cum), PHP_EOL; } } testRand('rand'); testRand('mt_rand'); testRand('lcg_value'); 实测结果如下: ------- results for `rand` ------- 0 | 29 14.50 14.50 1 | 18 9.00 23.50 2 | 24 12.00 35.50 3 | 13 6.50 42.00 4 | 26 13.00 55.00 5 | 15 7.50 62.50 6 | 25 12.50 75.00 7 | 22 11.00 86.00 8 | 15 7.50 93.50 9 | 13 6.50 100.00 ------- results for `mt_rand` ------- 0 | 23 11.50 11.50 1 | 21 10.50 22.00 2 | 22 11.00 33.00 3 | 19 9.50 42.50 4 | 18 9.00 51.50 5 | 21 10.50 62.00 6 | 18 9.00 71.00 7 | 20 10.00 81.00 8 | 21 10.50 91.50 9 | 17 8.50 100.00 ------- results for `lcg_value` ------- 0 | 15 7.50 7.50 1 | 20 10.00 17.50 2 | 16 8.00 25.50 3 | 18 9.00 34.50 4 | 20 10.00 44.50 5 | 15 7.50 52.00 6 | 28 14.00 66.00 7 | 28 14.00 80.00 8 | 23 11.50 91.50 9 | 17 8.50 100.00 从表中我们看到,同样是随机生成从0到9的10个整数,如果我们用rand函数的话,最少的数只产生了6.5%,最多的产生了14.5%,而如果用mt_rand的话,最少的产生了8.5%,最多的产生了11.5%,而lcg_value最少的产生了7.5%,最多的产生了14%。 显然,mt_rand产生的结果更加『均匀』,lcg_value其次,最不均匀的是rand。
随机数是不是均匀分布,实践来说话:
实测结果如下:
从表中我们看到,同样是随机生成从
0
到9
的10
个整数,如果我们用rand
函数的话,最少的数只产生了6.5%
,最多的产生了14.5%
,而如果用mt_rand
的话,最少的产生了8.5%
,最多的产生了11.5%
,而lcg_value
最少的产生了7.5%
,最多的产生了14%
。显然,
mt_rand
产生的结果更加『均匀』,lcg_value
其次,最不均匀的是rand
。