Как сгенерировать случайное число из равномерного распределения в php?

Я пытаюсь сгенерировать случайное число из равномерного распределения в PHP с помощью $group = rand(0,8), Я провел свой эксперимент около 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 () или array_rand проблема и единственная причина, по которой я задаю этот вопрос, заключается в том, что я новичок в php и не знаю, стоит ли мне использовать:

1

Решение

Если вам не нужна криптографически безопасная случайная выборка, используйте mt_rand («МТ» означает Мерсенн Твистер). Он работает быстрее и должен иметь лучшие статистические характеристики.

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 — это довольно маленькая выборка, поэтому в конечном итоге вы увидите «плохие» результаты с любым генератором случайных чисел.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]