математика — PHP: Как распределить значения по переменным с равной вероятностью?

Примечание для модераторов: Это не домашнее задание.

У меня есть следующий пример:

$points = 10;
$a = 0;
$b = 0;
$c = 0;
$d = 0;

Я хочу случайным образом распределить точки по переменным ($ a, $ b, $ c, $ d), пока $ точек не достигнет нуля. Итак, ожидаемый случайный вывод после запуска какой-либо функции / скрипта должен выглядеть следующим образом:

$points = 0;// Must be zero
$a = 3;
$b = 1;
$c = 0;
$d = 6;

Я думаю о том, чтобы сделать простое решение, а именно:

while($points > 0) {
$points_taken = mt_rand(0, $points);
$points -= $points_taken;
$a += $points_taken;

$points_taken = mt_rand(0, $points);
$points -= $points_taken;
$b += $points_taken;

$points_taken = mt_rand(0, $points);
$points -= $points_taken;
$c += $points_taken;

$points_taken = mt_rand(0, $points);
$points -= $points_taken;
$d += $points_taken;
}

У функции есть 1 проблема: у $ a гораздо больше шансов получить больше очков (или даже у всех), потому что он первый в списке, в то время как у $ d гораздо больше шансов получить меньше очков (или вообще нет очков), потому что это последний в списке.

Вопрос: Как я могу дать всем переменным равные шансы на распределение?

Заметка: Хорошо, если одна из переменных заняла все точки.

3

Решение

Вы можете использовать случайным образом выбрать одну из переменных из диапазона и присвоить ей переменную переменной.

$vars = range('a','d');
while ($points) {
$points_taken = mt_rand(0, $points);
$points -= $points_taken;
${$vars[mt_rand(0, 3)]} += $points_taken;
}
2

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

Что-то вроде этого?

    $points = 10;
$a = 0;
$b = 0;
$c = 0;
$d = 0;
for($i=0; $i<$points; $i++) {
$rand = rand(1,4);
if($rand == 1) {
$a++;
} else if ($rand == 2) {
$b++;
} else if ($rand == 3) {
$c++;
} else if ($rand == 4) {
$d++;
}
}
1

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