Ответ на ваш вопрос, как уже отмечали другие, заключается в том, что ваш код проваливается без возврата. Если 2
возвращается вызовом rand () как с первой попытки , так и со второй попытки (вероятность этого составляет 1/16), в результате вы получите 2
.
Но ваш подход к решению проблемы мог бы быть лучше.
И рекурсия, и зацикливание слишком сложны для этой проблемы. Это проблема mapping , а не проблема randomness . (Это напоминает некоторые распространенные проблемы интервьюирования со случайным кодированием, которые легче всего решить в цикле отклонения, но на самом деле это не проблема этого класса.)
Вам нужен один из трех результатов, а не четырех . (1, 3 и 4.) Это означает, что вы должны генерировать диапазон из трех случайных чисел, а не четырех. Вы можете переназначить с помощью массива или использовать if
. Обе возможности показаны ниже. Дайте мне знать, если у меня неправильный синтаксис - мой PHPfu слаб сегодня утром.
/* array remapping */
function pickServer() {
$remap = array(1, 3, 4);
return $remap[rand(1,3)];
}
/* if remapping */
function pickServer() {
$server = rand(1,3);
if ($server==2) {
$server=4;
}
return $server;
}
Я раньше этого не замечал, но Бальфа ожидал моего ответа. Он переназначил if
во втором примере. Вместо того, чтобы переназначить 2 на 4, он просто добавил один к любому ответу выше 1, что является эквивалентным решением.