【PHP8.x】rand()関数の使い方
rand関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
rand関数は、擬似乱数を生成する関数です。この関数は、引数を指定しない場合、0からPHPがサポートする最大値までの範囲でランダムな整数を返します。通常、この最大値はgetrandmax()関数で確認できます。
2つの整数引数 min と max を指定すると、rand関数は min 以上 max 以下の範囲でランダムな整数を生成して返します。例えば、rand(1, 10)と記述すると、1から10までのいずれかの整数がランダムに選ばれます。minはmaxよりも小さい値である必要があります。
PHP 7.1.0以降、rand()関数は mt_rand() 関数のエイリアスとして実装されています。これは、mt_rand()関数がより高品質な擬似乱数を生成し、統計的な偏りが少なく、一般的にパフォーマンスも優れているためです。そのため、新しいコードを記述する際には、rand()ではなくmt_rand()関数を使用することが公式に推奨されています。この変更により、rand()を使用しても実質的にmt_rand()と同じ高品質な乱数が得られますが、コードの意図を明確にするためにもmt_rand()の使用が望ましいとされています。
構文(syntax)
1<?php 2echo rand(1, 100);
引数(parameters)
int $min, int $max
- int $min: 生成する乱数の最小値を指定する整数
- int $max: 生成する乱数の最大値を指定する整数
戻り値(return)
int
指定された範囲内のランダムな整数を返します。
サンプルコード
PHPでランダム文字列を生成する
1<?php 2 3/** 4 * ランダムな文字列を生成する. 5 * 6 * @param int $length 生成する文字列の長さ 7 * 8 * @return string ランダムな文字列 9 */ 10function generateRandomString(int $length = 16): string 11{ 12 $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 13 $charactersLength = strlen($characters); 14 $randomString = ''; 15 for ($i = 0; $i < $length; $i++) { 16 $randomString .= $characters[rand(0, $charactersLength - 1)]; 17 } 18 return $randomString; 19} 20 21// 使用例 22$randomString = generateRandomString(20); 23echo "ランダムな文字列: " . $randomString . PHP_EOL;
PHPでランダムな文字列を生成する方法について解説します。このサンプルコードでは、rand()関数を利用して、指定された長さのランダムな文字列を生成するgenerateRandomString()関数を定義しています。
generateRandomString()関数は、引数として生成する文字列の長さを指定します。省略した場合はデフォルトで16文字の文字列が生成されます。関数内部では、まず、ランダム文字列に使用する文字セット(アルファベットと数字)を定義しています。次に、strlen()関数で文字セットの長さを取得し、rand()関数を使って、0から文字セットの長さ-1までの範囲でランダムな整数を生成します。
rand()関数は、引数として最小値と最大値を指定し、その範囲内のランダムな整数を返します。ここでは、文字セットのインデックスとして使用するために、rand(0, $charactersLength - 1)のように指定しています。
ループ処理の中で、rand()関数で生成されたインデックスを使用して、文字セットからランダムな文字を1文字ずつ抽出し、文字列に連結していきます。この処理を指定された文字列の長さになるまで繰り返すことで、ランダムな文字列が生成されます。
最後に、生成されたランダムな文字列を関数の戻り値として返します。サンプルコードでは、generateRandomString(20)として、20文字のランダムな文字列を生成し、echo文で結果を出力しています。このコードを実行すると、「ランダムな文字列: 」に続けて、生成された20文字のランダムな文字列が表示されます。
rand()関数は、指定された範囲の整数をランダムに生成します。サンプルコードでは、rand(0, $charactersLength - 1)で0から文字数-1までの範囲を指定しています。$charactersLength - 1としないと、範囲外アクセスになる可能性があります。
このコードはあくまで一例であり、セキュリティ要件が高いシステムでは、より安全なrandom_int()関数の利用を検討してください。random_int()は予測が難しく、暗号論的に安全な乱数を生成できます。また、rand()は予測可能性があり、セキュリティが重要な場面での利用は避けるべきです。
PHPで指定範囲の乱数を生成する
1<?php 2 3/** 4 * 最小値と最大値の間の一様分布の整数を生成する. 5 * 6 * より安全な乱数生成が必要な場合は、random_int 関数を使用することを推奨します。 7 * 8 * @param int $min 最小値 9 * @param int $max 最大値 10 * 11 * @return int 乱数 12 */ 13function generateRandomInteger(int $min, int $max): int 14{ 15 return rand($min, $max); 16} 17 18// 使用例 19$randomNumber = generateRandomInteger(1, 100); 20echo "ランダムな整数: " . $randomNumber . PHP_EOL;
PHPのrand関数は、指定された最小値$minと最大値$maxの間の整数をランダムに生成するために使用されます。この関数は、一様分布に基づいた乱数を返します。
上記のサンプルコードでは、generateRandomIntegerという関数を定義し、rand関数を利用して乱数を生成しています。generateRandomInteger関数は、最小値$minと最大値$maxを引数として受け取り、これらの値の範囲内でランダムな整数を返します。
rand($min, $max)は、$min以上$max以下の整数値を返します。例えば、rand(1, 100)と記述した場合、1から100までのいずれかの整数値がランダムに返されます。
このサンプルコードでは、生成された乱数を画面に出力する例を示しています。echo "ランダムな整数: " . $randomNumber . PHP_EOL;という行は、「ランダムな整数: 」という文字列と生成された乱数$randomNumberを連結して表示し、最後に改行コードPHP_EOLを追加しています。
なお、より安全な乱数生成が必要な場合は、rand関数ではなくrandom_int関数の使用が推奨されています。random_int関数は、暗号学的に安全な乱数生成器を使用しているため、予測困難な乱数を生成できます。
rand関数は、指定された範囲内で乱数を生成しますが、暗号論的に安全ではありません。セキュリティが重要な場面では、より安全なrandom_int関数の使用を検討してください。rand関数は、予測可能な乱数を生成する可能性があるため、例えばパスワード生成などには適していません。$minが$maxより大きい場合、rand関数は予期せぬ動作をする可能性があります。$minと$maxの値を適切に設定してください。また、PHPのバージョンによっては、乱数生成器の初期化が必要な場合がありますが、PHP 7.1.0以降では自動的に初期化されるため、通常は気にする必要はありません。
PHP 8で安全なランダムバイト列を生成する
1<?php 2 3/** 4 * 安全なランダムバイト列を生成する。 5 * 6 * PHP 8ではrand()関数は削除され、代わりにmt_rand()、 7 * および暗号学的に安全な乱数生成関数であるrandom_int()やrandom_bytes()が推奨されています。 8 * 9 * この関数は、キーワード「random_bytes」に最も関連性の高いrandom_bytes()関数を使用して、 10 * 指定された長さの暗号学的に安全なランダムバイト列を生成します。 11 * これは、パスワードのソルト、セキュリティトークン、セッションIDなどの生成に最適です。 12 * 13 * @param int $length 生成するバイト列の長さ(バイト単位)。デフォルトは16バイト。 14 * @return string 生成されたランダムバイト列(バイナリ文字列)。 15 * @throws Exception 暗号学的に安全な乱数を生成できない場合にスローされます。 16 */ 17function generateSecureRandomBytes(int $length = 16): string 18{ 19 if ($length <= 0) { 20 throw new InvalidArgumentException('生成するバイト列の長さは正の整数である必要があります。'); 21 } 22 23 try { 24 // random_bytes()は、指定された長さの暗号学的に安全なランダムバイト列を生成します。 25 // これは、セキュリティが重要な用途(例: トークン、ソルト)に適しています。 26 $bytes = random_bytes($length); 27 } catch (Exception $e) { 28 // 暗号学的に安全な乱数を生成できない場合に発生する例外をキャッチします。 29 // 例: 十分なエントロピーがないシステムなど。 30 // 実運用では、ここで適切なエラー処理やフォールバック戦略を実装するべきです。 31 error_log('Failed to generate secure random bytes: ' . $e->getMessage()); 32 throw new Exception('セキュリティトークンの生成に失敗しました。詳細: ' . $e->getMessage()); 33 } 34 35 return $bytes; 36} 37 38// --- 使用例 --- 39try { 40 // 16バイト(128ビット)のランダムバイト列を生成 41 $randomBytes16 = generateSecureRandomBytes(16); 42 echo "16バイトのランダムバイト列(バイナリ): " . $randomBytes16 . PHP_EOL; 43 echo "16バイトのランダムバイト列(16進数変換): " . bin2hex($randomBytes16) . PHP_EOL; 44 echo "長さ: " . strlen($randomBytes16) . "バイト" . PHP_EOL . PHP_EOL; 45 46 // 32バイト(256ビット)のランダムバイト列を生成 47 $randomBytes32 = generateSecureRandomBytes(32); 48 echo "32バイトのランダムバイト列(バイナリ): " . $randomBytes32 . PHP_EOL; 49 echo "32バイトのランダムバイト列(16進数変換): " . bin2hex($randomBytes32) . PHP_EOL; 50 echo "長さ: " . strlen($randomBytes32) . "バイト" . PHP_EOL . PHP_EOL; 51 52 // デフォルトの長さ(16バイト)で生成 53 $defaultBytes = generateSecureRandomBytes(); 54 echo "デフォルトの長さ(16バイト)のランダムバイト列(16進数変換): " . bin2hex($defaultBytes) . PHP_EOL; 55 echo "長さ: " . strlen($defaultBytes) . "バイト" . PHP_EOL; 56 57} catch (Exception $e) { 58 // 乱数生成中に発生したエラーを表示 59 echo "エラー: " . $e->getMessage() . PHP_EOL; 60} 61
PHP 8では、古いrand()関数は推奨されず、セキュリティに配慮したmt_rand()や、暗号学的に安全なrandom_int()およびrandom_bytes()関数が推奨されています。このサンプルコードは、セキュリティが重要な場面で利用されるrandom_bytes()関数を内部で使用し、暗号学的に安全なランダムバイト列を生成するgenerateSecureRandomBytes関数を示しています。
generateSecureRandomBytes関数は、引数$lengthで指定された長さのランダムなバイト列を生成します。$lengthは生成するバイト列の長さをバイト単位で指定し、省略した場合はデフォルトで16バイトが生成されます。この関数は、パスワードのハッシュ化に使うソルトや、セッションID、セキュリティトークンなど、予測不可能性が求められるセキュリティ関連のデータの生成に最適です。戻り値としては、指定された長さのランダムなバイト列がバイナリ形式の文字列として返されます。もし暗号学的に安全な乱数を生成できないシステム環境の場合には、Exceptionがスローされるため、適切なエラー処理が必要です。サンプルコードでは、生成されたバイナリ文字列を見やすくするため、bin2hex()関数で16進数形式に変換して表示しています。
PHP 8以降では、単純な乱数生成を行うrand()関数は削除され、セキュリティが重要な場面ではこのサンプルコードで利用されているrandom_bytes()関数が推奨されます。random_bytes()は、パスワードのソルトやセキュリティトークンなど、暗号学的に安全なランダムバイト列を生成するために使用します。生成されるのはバイナリ文字列のため、人間が視認する際にはbin2hex()関数などで16進数に変換して表示することが一般的です。また、システムのエントロピー不足などにより乱数生成に失敗することがあるため、必ずtry-catchによる例外処理を実装し、エラー発生時の適切な対応を検討してください。目的や必要とされるセキュリティレベルに応じて、適切な乱数生成関数を選びましょう。