【问题标题】:How to generate a random number from a uniform distribution in php?如何从php中的均匀分布生成随机数?
【发布时间】:2016-11-16 23:17:22
【问题描述】:

我正在尝试使用$group = rand(0,8) 从 php 中的均匀分布中生成一个随机数。我进行了大约 200 次实验,得到了以下分布,这表明所有组的被选中概率不均等。

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 新手,不知道是否应该使用:

【问题讨论】:

  • 任何随机整数函数都提供了一个统一的分布,也许除了stats_rand_gen_iuniform(),但是这些函数是高度无证的,需要你安装 pear stats 包。但是,您可以创建自己的函数,检查出现次数 array_count_values() 与 sizeof() 数组以确定随机整数是否值得重新滚动。

标签: php random uniform-distribution


【解决方案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 是非常小的样本,因此最终您会看到任何随机数生成器的“坏”结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多