Примечание для модераторов: Это не домашнее задание.
У меня есть следующий пример:
$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 гораздо больше шансов получить меньше очков (или вообще нет очков), потому что это последний в списке.
Вопрос: Как я могу дать всем переменным равные шансы на распределение?
Заметка: Хорошо, если одна из переменных заняла все точки.
Вы можете использовать случайным образом выбрать одну из переменных из диапазона и присвоить ей переменную переменной.
$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++;
}
}