Я хотел бы определить пробелы в rand() func. в PHP
Зазор как в математике.
Например;
$integer1= rand(1,100); но я хочу устранить разрыв между 25,60.
это как rand((1,25),(60,100));
конечно, эта нотация неприемлема для php.
Любое предложение, кроме массивов? -Спасибо
Mohammed Yassine CHABLI да, именно в этом проблема.






$integer1 = rand (1, 66); // [1 .. 66]
if ($integer1 > 25) $integer1 += 34; // [1 .. 25, 60 .. 100]
первый пробел идеален с if . но второй пробел также должен быть случайным. от 60 до 100. другой if.. if ($integer1 > 25 && $integer1 < 60){....} или еще. может быть, но я думаю. кстати спасибо.
В исходном вопросе был только один пробел: [26..59]. Если вам нужно несколько, поставьте использовать несколько стататентов if или, если пробелов много, используйте их отсортированные массивы и бинарный поиск. Дайте мне знать, если вам нужно более подробное объяснение того, как бороться с большим количеством пробелов.
Это создает несбалансированную вероятность; Я не рекомендую его использовать - ОП не запрашивал взвешенную случайность.
Теперь мое решение генерирует равномерно распределенное случайное число. После первой строки все числа в диапазоне от 1 до 66 имеют одинаковую вероятность. Затем я просто сдвигаю некоторые числа, не влияя на их вероятности.
Если у вас только одна кепка, то ответ @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 - Да, спасибо, array_rand будет лучше, чем shuffle
Зависит... Если вам нужен только один номер из массива, тогда да, array_rand хорош. Но если вам нужно 10, то перетасуйте и array_slice.
Предложение: 3v4l.org/kJUOE
Ну, вы можете сделать свою собственную функцию, но остерегайтесь следующего. Каждое число должно быть разыграно с равной вероятностью. Вам нужно будет определить, из какого диапазона на самом деле будет взято число, с вероятностью, пропорциональной размеру диапазона, например. рисование из [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
в этом примере вы хотите сгенерировать число от 1 до 100 и исключить числа от 25 до 60?