2012-05-03 4 views
5

У меня есть PHP-скрипт, где у меня есть массив целых чисел, скажем $forbidden.Случайное целое число с условиями

Я хочу получить случайное целое число от 1 до 400, которое не находится в $forbidden.

Конечно, я не хочу, чтобы какой-либо цикл прерывался, когда rand дает рабочий результат. Я бы хотел что-то более эффективное.

Как вы это делаете?

+1

Почему цикл не эффективен? –

+0

@MichaelRobinson: Это не эффективно, потому что $ forbidden может быть очень большим. Paul: Я думал о том, чтобы получить все целые числа в массиве, а затем получить образец из него, но мне было интересно, есть ли что-то более приятное на языке – Cydonia7

+0

@MichaelRobinson: Looping неэффективен, потому что теоретически вы можете ударить по запрещенным номерам 1000000 раз подряд (хотя, если это произойдет, вы, вероятно, должны пойти и заполнить какую-то лотерею), но да. –

ответ

10

Место всех запрещенных номеров в массиве и используйте array_diff от range(1,400). Вы получите массив разрешенных номеров, выберите случайный номер с array_rand().

<?php 

$forbidden = array(2, 3, 6, 8); 
$complete = range(1,10); 
$allowed = array_diff($complete, $forbidden); 

echo $allowed[array_rand($allowed)]; 

Таким образом, вы удаляете исключенные номера из набора выбора, и сводит на нет необходимость в цикле :)

+0

Я не знал array_diff, искал его какое-то время! Спасибо за ответ. – Cydonia7

0

Плодоовощной массив разрешенных номеров. Узнайте номер в этом массиве. Выберите один из них случайным образом.

Смежные вопросы