2016-11-16 148 views
1

我試圖從使用$group = rand(0,8)在php中的統一分佈生成一個隨機數。我跑了200次左右的實驗,並得到以下分佈,這表明所有組沒有被選中的概率相等。如何從一個統一的分佈在PHP中生成一個隨機數?

Group | Freq. Percent  Cum. 
------+------------------------------ 
0  | 20  9.52  9.52 
1  | 4  1.90  11.43 
2  | 25  11.90  23.33 
3  | 32  15.24  38.57 
4  | 27  12.86  51.43 
5  | 22  10.48  61.90 
6  | 30  14.29  76.19 
7  | 24  11.43  87.62 
8  | 26  12.38  100.00 
------+------------------------------- 
Total | 210  100.00 

我在這裏讀話題PHP: rand() or array_rand trouble,我問這個問題的唯一原因是因爲我是新來的PHP,不知道我是否應該使用:

+0

中的任何隨機整數函數都會提供一個統一的分佈,*或許*除了'stats_rand_gen_iuniform()',但這些函數高度未記錄並且需要您安裝pear stats包。然而,你可以創建自己的函數,檢查array_count_values()與sizeof()數組的出現次數,以確定隨機整數是否值得重傳。 – Xorifelse

回答

1

如果您不需要密碼安全的隨機數,請使用mt_rand(「mt」代表Mersenne Twister)。它工作得更快,應該有更好的統計特徵。

function testRand($randFunction, $groupsNumber = 10, $rollsNumber = 210) 
{ 
    $frequencies = array_fill(0, $groupsNumber, 0); 
    foreach (range(1, $rollsNumber) as $ignored) { 
     $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'); 

// I don't have PHP 7 or stats package handy. Uncomment if you do 
// testRand('random_int'); 
// testRand('stats_rand_gen_iuniform'); 

輸出:

------- results for `rand` ------- 
0 |  26  12.38 12.38 
1 |  20  9.52 21.90 
2 |  18  8.57 30.48 
3 |  21  10.00 40.48 
4 |  25  11.90 52.38 
5 |  12  5.71 58.10 
6 |  26  12.38 70.48 
7 |  14  6.67 77.14 
8 |  19  9.05 86.19 
9 |  29  13.81 100.00 

------- results for `mt_rand` ------- 
0 |  17  8.10 8.10 
1 |  25  11.90 20.00 
2 |  21  10.00 30.00 
3 |  20  9.52 39.52 
4 |  18  8.57 48.10 
5 |  18  8.57 56.67 
6 |  25  11.90 68.57 
7 |  23  10.95 79.52 
8 |  21  10.00 89.52 
9 |  22  10.48 100.00 

作爲一個方面說明,210是非常小的採樣,所以最終你會看到任何隨機數生成器「壞」的結果。

相關問題