Випадкове число в діапазоні [хв - макс] за допомогою PHP


84

Чи є спосіб генерувати випадкове число на основі мінімуму та максимуму?

Наприклад, якщо min дорівнював 1, а max 20, він повинен генерувати будь-яке число від 1 до 20, включаючи 1 і 20?


1
Нова версія php має криптографічно захищений генератор випадкових чисел .
Сальвадор Далі

1
Для PHP 7 + використання random_int(), random_bytes()або openssl_random_pseudo_bytes() . як сказав @Salvador Dali rand(), не генеруйте криптографічно безпечних результатів. Див. Документацію php.net/manual/en/function.rand.php
FrozenFire

Відповіді:


147
<?php
  $min=1;
  $max=20;
  echo rand($min,$max);
?>

я думав, що min та max для rand - це кількість цифр, яку слід використовувати замість цифр :) thnx
Val

Пов’язане: якщо PHP_INT_MAX < ($max-$min)вам потрібно скласти інтервали разом, як описано у цій відповіді .
єпископ

rand () перед PHP7.1 просто поганий. Він використовує алгоритм LCG, який дає результат із передбачуваним результатом. Це також повільно. Оскільки PHP7.1 rand () зроблений псевдонімом mt_rand (), тож це вже не погано. PHP7 також представив криптографічно захищений random_int (), однак цього слід уникати, якщо це не важливо, оскільки це набагато повільніше, ніж mt_rand ()
xZero

34

У новому PHP7 нарешті є підтримка криптографічно захищених псевдовипадкових цілих чисел.

int random_int ( int $min , int $max )

random_int - генерує криптографічно захищені псевдовипадкові цілі числа

що в основному робить попередні відповіді застарілими.


2
Це чудово! Але поки веб-хости не підтримують PHP7 більш глобально, це не корисно для тих, хто створює продукти для розповсюдження, на жаль. Тож попередні відповіді про те, що ТАКЖЕ робота над PHP7, як і раніше є найкращою практикою.
Метт Кромвель,

1
@MattCromwell. Я з вами не згоден. Поки сервіси хостингу не підтримують PHP7, ми повинні використовувати polyfill random_intі random_bytesфункціонувати - github.com/paragonie/random_compat .
Володимир Посвістелік

Мені цікаво, чи є коли-небудь причина НЕ використовувати random_int ? Якщо він дає "кращі" випадкові числа, чому б не використовувати його з некриптологічних причин?
Брайан Лейшман,

1
@BrianLeishman Я волів би використовувати його для всього. Єдиний мінус, про який я можу здогадатися: він, мабуть, покладається на джерело випадковості і може зазнати невдачі, якщо ви поза ним. Це може бути дорожче (потрібно перевірити), але я сумніваюся, що ця одна функція має велике значення
Сальвадор Далі

Я знаю, що це повільніше, але досить незначно, щоб не повертатися і не міняти вже існуючі random_ints на rands. Крім того, моїм випадком використання є алгоритм повторної спроби, і я точно не хочу, щоб кілька невдалих функцій злипалися після сну через передбачувані випадкові вставки
Брайан Лейшман

19

Швидше швидше версія буде використовувати mt_rand:

$min=1;
$max=20;
echo mt_rand($min,$max);

Джерело: http://www.php.net/manual/en/function.mt-rand.php .

ПРИМІТКА. Для того, щоб це працювало, на вашому сервері повинен бути включений модуль Math PHP. Якщо цього не сталося, виправте помилку хосту, щоб увімкнути його, або вам доведеться використовувати звичайний (і повільніший) rand ().


6
ви маєте на увазі швидше, правда? різниця полягає (набравши == швидше проти швидше == ефективність)
Вал

english.stackexchange.com/questions/31732/… - насправді може бути і те, і інше
pee2pee


6

Я зібрав тут відповіді та зробив його незалежним від версії;

function generateRandom($min = 1, $max = 20) {
    if (function_exists('random_int')):
        return random_int($min, $max); // more secure
    elseif (function_exists('mt_rand')):
        return mt_rand($min, $max); // faster
    endif;
    return rand($min, $max); // old
}


0

Спробуйте цей. Він створить ідентифікатор відповідно до вашого бажання.

function id()
{
 // add limit
$id_length = 20;

// add any character / digit
$alfa = "abcdefghijklmnopqrstuvwxyz1234567890";
$token = "";
for($i = 1; $i < $id_length; $i ++) {

  // generate randomly within given character/digits
  @$token .= $alfa[rand(1, strlen($alfa))];

}    
return $token;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.