php 均匀分布随机数

php 如何产生均匀分布U(0,1)的随机数
有合适的库或者方法吗?

或者能解答下这个随机函数lcg_value()是否是均匀分布的
谢谢。

阅读 4.4k
2 个回答

随机数是不是均匀分布,实践来说话:

<?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

从表中我们看到,同样是随机生成从0910个整数,如果我们用rand函数的话,最少的数只产生了6.5%,最多的产生了14.5%,而如果用mt_rand的话,最少的产生了8.5%,最多的产生了11.5%,而lcg_value最少的产生了7.5%,最多的产生了14%

显然,mt_rand产生的结果更加『均匀』,lcg_value其次,最不均匀的是rand

看着楼上。。本来想说什么的,却又说不出了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题