mt_rand и rand не работают (PHP)

У меня проблема: когда я пытаюсь генерировать числа случайным образом с помощью mt_rand или rand (в большем масштабе), я вообще не получаю никакого результата. Раньше это нормально работало на моем сервере, но теперь, похоже, возникли проблемы, и я не знаю, почему.

<?php
echo 'Your number is: '.rand(0, 99999999999999999999);
?>

Где я обновляю его до чего-то вроде (используя 9-значный номер):

<?php
echo 'Your number is: '.rand(0, 999999999);
?>

нижний пример будет работать нормально. Недавно я изменил версию своего сервера PHP 7.0. Есть ли способ увеличить максимальное число или лучший способ сделать это? Спасибо.


person Danny Franklin    schedule 29.04.2016    source источник
comment
Вам просто нужна случайная строка, верно? будь то цифры или символы?   -  person Pardeep Poria    schedule 29.04.2016
comment
Существует константа с именем PHP_INT_MAX, может быть, это то, что вы ищете?   -  person paskl    schedule 29.04.2016
comment
вы даете значение с плавающей запятой, поэтому в php 7.0 это дает вам ошибку   -  person Sumit Kumar    schedule 29.04.2016


Ответы (3)


Чтобы запустить код в php 7, вам нужно привести тип

<?php
echo 'Your number is: '.rand(0,(int) 99999999999999999999);
?>
person Sumit Kumar    schedule 29.04.2016
comment
Почему? Вы имеете в виду, если strict_types=1 включен? - person NikiC; 29.04.2016
comment
Это потому, что rand ожидает, что второй параметр будет целым числом. Когда число слишком велико, чтобы поместиться в целое число, PHP превращает его в число с плавающей запятой (которое может содержать большие числа). Вы должны настроить свой сервер для отображения предупреждений во время разработки (PHP показывает предупреждение); - person Sverri M. Olsen; 02.05.2016

Как в 32-битных, так и в 64-битных системах число 99999999999999999999 слишком велико для представления в виде целого числа в PHP 7, поэтому оно становится числом с плавающей запятой.

Однако mt_rand() принимает два целых числа. Поскольку 99999999999999999999 слишком велико, чтобы быть целым числом, когда вы передаете его функции, PHP 7 выдает ошибку, потому что его нельзя безопасно преобразовать. Вы не получили эту ошибку для 999999999, потому что она достаточно мала, чтобы быть целым числом.

В любом случае, ваш текущий код, вероятно, не делает то, что вы хотите в PHP 5: 99999999999999999999 молча преобразуется в 7766279631452241920 в 64-битных системах и во что-то еще в 32-битных системах. Таким образом, вы не получаете полный диапазон случайных чисел. Вы написали rand(0, 99999999999999999999), а на самом деле получили rand(0, 7766279631452241920).

Если вам просто нужно случайное число из максимально возможного диапазона, попробуйте следующее:

<?php
echo 'Your number is: '.rand(0, PHP_INT_MAX);
?>

PHP_INT_MAX — это константа, содержащая максимально возможное целое число (которое будет отличаться в зависимости от того, используете ли вы 32-разрядную или 64-разрядную версию). Таким образом, это всегда даст вам максимально широкий диапазон случайных положительных чисел из этой функции.

person Andrea    schedule 16.05.2016

Microtime генерируется случайным образом каждый раз.

function microtimeRand( $min, $max ) {
    $microtimeInt = intval( microtime( true ) * 100 );
    $microtimeInt = $microtimeInt % ($max - $min);
    $microtimeInt += $min;

    return $microtimeInt;
}
person kodmanyagha    schedule 21.12.2018