PHP, как получить случайное число, отличное от значений массива

Пример: у меня есть массив с 3 значениями:

0 = 1
1 = 4
2 = 5

Я хочу получить случайное число, например

$random = rand(1, 5);

Но мне нужно получить число, отличное от значений массива. Мне нужно, чтобы он возвращал 2 или 3.


person Rockman    schedule 09.04.2015    source источник
comment
Итак, у вас есть диапазон, из которого вы хотите получить случайное число, но без чисел из вашего массива, верно? Вы тоже что-то пробовали?   -  person Rizier123    schedule 10.04.2015
comment
Спасибо за ответ! Это сработало, но иногда я получаю фатальную ошибку: Фатальная ошибка: превышено максимальное время выполнения 30 секунд.   -  person Rockman    schedule 10.04.2015
comment
@Rockman Ты читал мой первый комментарий ^ ?   -  person Rizier123    schedule 10.04.2015
comment
Вы исключаете большинство возможных случайных чисел. Поэтому иногда может потребоваться много попыток, прежде чем он выберет одну из разрешенных.   -  person Barmar    schedule 10.04.2015


Ответы (1)


Это должно сработать для вас:

(Здесь я создаю диапазон, из которого вы получаете случайное число, с помощью range(). Затем Я избавляюсь от этих чисел, которые вам не нужны, с помощью array_diff(). И в конце вы можете просто использовать array_rand() для получения случайного ключа/ количество)

<?php

    $blacklist = [1, 4, 5];
    $range = range(1, 5);
    $randomArray = array_diff($range, $blacklist);
    echo $randomArray[array_rand($randomArray, 1)];

?>

выход:

2 or 3

ИЗМЕНИТЬ:

Только что сделал несколько тестов, и метод с циклом намного медленнее, чем код выше!

Я создал массив (черный список) от 1 до 100 000 и массив случайных чисел от 1 до 100 001.

Так что этот скрипт должен создавать только одно/уникальное случайное число. С методом цикла вы получаете ошибку:

Неустранимая ошибка: превышено максимальное время выполнения 30 секунд.

А с опубликованным кодом выше это занимает в среднем 1,5 секунды.

person Rizier123    schedule 09.04.2015
comment
Это намного лучше, чем цикл, он не должен вызывать ошибку превышения времени. - person Barmar; 10.04.2015
comment
@Barmar Спасибо, вот почему я опубликовал это, когда увидел возможный обман, поскольку такого ответа не было. - person Rizier123; 10.04.2015
comment
@Barmar Только что сделал несколько тестов, и это огромная разница! (см. обновленный ответ) - person Rizier123; 10.04.2015
comment
@ Rizier123 Еще раз спасибо! Это сработало просто отлично, и это действительно то, что я искал. Я не знал этого array_diff. - person Rockman; 10.04.2015
comment
@Rockman Добро пожаловать! (Кстати: вы можете принять ответ, который помог вам больше всего и решил вашу проблему (meta.stackexchange.com/q/5234) !) - person Rizier123; 10.04.2015
comment
Думаю, теперь я принял... Это был мой первый вопрос здесь, в stackoverflow, я все еще учусь его использовать, хе-хе. - person Rockman; 10.04.2015
comment
@Rockman, нет проблем, приятного вам дня: D (к вашему сведению: вы можете совершить экскурсию здесь: stackoverflow.com/tour и немного посмотреть, как этот сайт работает и где все есть) - person Rizier123; 10.04.2015