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 гораздо больше шансов набрать меньше очков (или вообще нет очков), потому что это последний в списке.

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

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

2 ответа

Решение

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

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

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

    $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++;
        }
    }
Другие вопросы по тегам