Пробелы php в функции random()

Я хотел бы определить пробелы в rand() func. в PHP Зазор как в математике. Например;

$integer1= rand(1,100); но я хочу устранить разрыв между 25,60. это как rand((1,25),(60,100)); конечно, эта нотация неприемлема для php.

Любое предложение, кроме массивов? -Спасибо

в этом примере вы хотите сгенерировать число от 1 до 100 и исключить числа от 25 до 60?

Yassine CHABLI 19.03.2019 14:10

Mohammed Yassine CHABLI да, именно в этом проблема.

user4816892 20.03.2019 22:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
107
3

Ответы 3

$integer1 = rand (1, 66); // [1 .. 66]
if ($integer1 > 25) $integer1 += 34; // [1 .. 25, 60 .. 100]

первый пробел идеален с if . но второй пробел также должен быть случайным. от 60 до 100. другой if.. if ($integer1 > 25 && $integer1 < 60){....} или еще. может быть, но я думаю. кстати спасибо.

user4816892 20.03.2019 22:59

В исходном вопросе был только один пробел: [26..59]. Если вам нужно несколько, поставьте использовать несколько стататентов if или, если пробелов много, используйте их отсортированные массивы и бинарный поиск. Дайте мне знать, если вам нужно более подробное объяснение того, как бороться с большим количеством пробелов.

Mikhail Vladimirov 21.03.2019 10:16

Это создает несбалансированную вероятность; Я не рекомендую его использовать - ОП не запрашивал взвешенную случайность.

mickmackusa 25.03.2019 12:21

Теперь мое решение генерирует равномерно распределенное случайное число. После первой строки все числа в диапазоне от 1 до 66 имеют одинаковую вероятность. Затем я просто сдвигаю некоторые числа, не влияя на их вероятности.

Mikhail Vladimirov 25.03.2019 12:34

Если у вас только одна кепка, то ответ @Mikhail кажется лучшим выбором. если у вас может быть несколько пробелов, то один вариант может быть:

$a = range(1,25);
$b =  range(60, 100); 
// add another ranges if needed
$arr = array_merge($a, $b); // merge all ranges 
echo $arr[array_rand($arr)];

Хотя бы array_rand…!?

deceze 19.03.2019 14:35

@deceze - Да, спасибо, array_rand будет лучше, чем shuffle

Oto Shavadze 19.03.2019 14:43

Зависит... Если вам нужен только один номер из массива, тогда да, array_rand хорош. Но если вам нужно 10, то перетасуйте и array_slice.

Andreas 19.03.2019 14:50

Предложение: 3v4l.org/kJUOE

Andreas 19.03.2019 14:55

Ну, вы можете сделать свою собственную функцию, но остерегайтесь следующего. Каждое число должно быть разыграно с равной вероятностью. Вам нужно будет определить, из какого диапазона на самом деле будет взято число, с вероятностью, пропорциональной размеру диапазона, например. рисование из [1,10], [21, 40] должно рисовать числа из [21,40] примерно в два раза чаще, чем из [1,10].

Вот общая идея:

Определить длину всех диапазонов.

Нарисуйте случайное число от 0 до длины всех диапазонов

Проверьте, в какой диапазон попадает число.

Нарисуйте соответствующее число из диапазона, в который оно попадает.

 function randFromRanges(...$ranges) {
       $totalRangeSize = array_sum(array_map(function ($range) { 
             return $range[1] - $range[0];
       }, $ranges));
       $numberToDraw = rand(0, $totalRangeSize);
       foreach ($ranges as $range) {
            if ($numberToDraw <=  ($range[1] - $range[0])) {
                return $range[0]+$numberToDraw;
            } else {
               $numberToDraw -= ($range[1] - $range[0]);
            }
       }
   }

Вот песочница, которая показывает, что все значения кажутся равновероятными:

http://sandbox.onlinephpfunctions.com/code/b02603e4a9986132073d203c98f8255c2dd62e47

Другие вопросы по теме