Случайное число в диапазоне [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
}
vonUbisch
источник
4
rand(1,20)

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

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

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

Winwaed
источник
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;
}
asi_x
источник