鍍金池/ 問答/PHP/ php 均勻分布隨機(jī)數(shù)

php 均勻分布隨機(jī)數(shù)

php 如何產(chǎn)生均勻分布U(0,1)的隨機(jī)數(shù)
有合適的庫或者方法嗎?

或者能解答下這個(gè)隨機(jī)函數(shù)lcg_value()是否是均勻分布的
謝謝。

回答
編輯回答
巴扎嘿

看著樓上。。本來想說什么的,卻又說不出了

2018年9月4日 22:15
編輯回答
薔薇花

隨機(jī)數(shù)是不是均勻分布,實(shí)踐來說話:

<?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');

實(shí)測結(jié)果如下:

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

從表中我們看到,同樣是隨機(jī)生成從0910個(gè)整數(shù),如果我們用rand函數(shù)的話,最少的數(shù)只產(chǎn)生了6.5%,最多的產(chǎn)生了14.5%,而如果用mt_rand的話,最少的產(chǎn)生了8.5%,最多的產(chǎn)生了11.5%,而lcg_value最少的產(chǎn)生了7.5%,最多的產(chǎn)生了14%

顯然,mt_rand產(chǎn)生的結(jié)果更加『均勻』,lcg_value其次,最不均勻的是rand。

2017年4月7日 21:06