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