2016-11-16 145 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是非常小的采样,所以最终你会看到任何随机数生成器“坏”的结果。

相关问题