2015-04-09 3 views
1

Пример: У меня есть массив с 3-мя значениями:PHP, как получить случайное число, которое отличается от значений массива

0 = 1 
1 = 4 
2 = 5 

Я хочу, чтобы получить случайное число, как

$random = rand(1, 5); 

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

+0

Итак, у вас есть диапазон от того места, где вы хотите получить случайное число, но без цифр из вашего массива, не так ли? Также вы что-то пробовали? – Rizier123

+0

Итак 'do {$ random = rand (1, 5); } while (in_array ($ random, $ myArray)); ' –

+0

Спасибо за ответ! Это сработало, но иногда я получаю Fatal Error: Неустранимая ошибка: превышено максимальное время выполнения 30 секунд – Rockman

ответ

0

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

(Здесь я создаю диапазон от того, где вы получите ваше случайное число с 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 

EDIT:

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

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

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

Fatal error: Maximum execution time of 30 seconds exceeded

И с размещенным выше кодом в среднем требуется 1,5 секунды.

+1

Это намного лучше, чем цикл, это не должно вызывать превышения времени. – Barmar

+0

@Barmar Спасибо, Вот почему я разместил его, когда увидел возможный обман, так как такого ответа не было. – Rizier123

+0

@Barmar Просто сделал некоторые тесты, и это огромная разница! (см. обновленный ответ) – Rizier123

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