Случайное число в диапазоне [min - max] с использованием 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

Ответы:


148
<?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
ты имеешь в виду быстрее? разница в том (печатать == быстрее vs быстрее == по производительности)
Val

english.stackexchange.com/questions/31732/… - на самом деле может быть и то, и другое
pee2pee 02


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
}

4
rand(1,20)

Документация по функции PHP rand находится здесь:

http://php.net/manual/en/function.rand.php

Используйте srand()функцию, чтобы установить начальное значение генератора случайных чисел.


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.