Как base_convert () создает случайную символьную строку в php?

#php #math

Вопрос:

Я сам изучаю php с помощью коротких упражнений, и я прошел через это небольшое упражнение, чтобы сгенерировать случайную строку из 11 символов

 public function Random_string()
 {
        $number = rand(10e12, 10e16);
        echo base_convert($number, 10, 36);
   //Sample output=9n4jfyh18v9
 }
 

Я думал, что функция сама сгенерировала строку, но когда я использую следующие значения, она не генерирует никакой строки.

 <?php
$number = "0977567";
echo base_convert($number,8,10);
//output=32631
?>
 

Насколько я знаю rand() , функция генерирует случайные числа, в то время base_convert() как функция преобразует число из одной базы чисел в другую. Как в этом процессе генерируется строка? Мне было очень трудно это понять. Было бы очень хорошо, если бы кто-нибудь мог пролить на это свет. Спасибо.

P.S. Первая функция показывает ошибку в PHP 7, но она полностью работает в PHP 5

Ответ №1:

Вы правы, rand(int $min, int $max) генерирует случайное целое число между $min и $max , см. Документацию.

И base_convert(string $num, int $from_base, int $to_base) преобразуется $num из $from_base в $to_base , но $num вот строка, потому что шестнадцатеричные и другие числа выше базы 10 также могут содержать символы, а не только числа, см. Документацию. Это также причина, по которой эта функция возвращает строку, даже если в некоторых случаях она на самом деле не будет содержать никаких букв.

PHP также преобразует строку в число, если это необходимо, например, следующий код будет выводиться 124 как int :

 $a = "123";
var_dump($a 1);
 

В вашем первом примере, даже если $number это целое число, PHP делает вам одолжение, преобразуя его в строку, когда вы вызываете base_convert из базы 10 в 36.

Во втором примере возникает проблема, потому что входные $number="0977567" данные содержат цифру 9 , и вы хотите преобразовать ее из базы 8 в 10. Но цифра 9 не существует в базовом числе 8, только цифры от 0 до 7 . В этом случае PHP игнорирует недопустимый символ 9 и преобразует только 077567 из базы 8 в базу 10 , что и происходит 32631 .

Пожалуйста, всегда проверяйте предупреждения PHP, чтобы обнаружить подобные проблемы. Во время обучения и тестирования рекомендуется настроить error_reporting(E_ALL); так, чтобы вы получали каждое сообщение. Проверьте документацию.