PHPで乱数を生成する関数はrand()
とmt_rand()
がありますが、mt_rand()
の方が「よりよい乱数」を生成するとして推奨されています。
基本的な使い方から、乱数を使ったサンプルをご紹介します。
目次
mt_rand関数で乱数生成
よりよい乱数を生成する関数です。
rand()
より高速で、優れた乱数を生成してくれるので、乱数生成にはmt_rand()
を使うようにしましょう。
mt_randの使い方
1 2 |
// echoで出力 echo mt_rand(); |
以下リンクよりサンプルページを開いて動作確認してみましょう。
乱数の範囲を指定する
桁数を揃えたり、サイコロのような特定の範囲で乱数を生成する場合は、範囲も指定できます。
1 2 |
// 乱数の範囲を指定し、1~6の間で乱数を生成 echo mt_rand(1, 6); |
以下リンクよりサンプルページを開いて動作確認してみましょう。
mt_randの構文
mt_rand (最小値, 最大値(省略可));
mt_rand()
の最小値と最大値は省略できます。
その場合、乱数は0
〜mt_getrandmax()
の数値まで、ランダムに生成されます。
ちなみに、mt_rand()
でパスワードなどの暗号生成は暗号学的にも安全ではないため、やめましょう。
mt_getrandmaxで乱数の最大値を確認する
mt_rand()
の最大値を調べるには、mt_getrandmax()
を使います。
1 2 |
// 乱数の最大値を取得 echo mt_getrandmax(); |
2147483647
わたくしの環境では上記の最大値が表示されました。
mt_getrandmax()
は最大値を以下のように算出しています。
2 ^ 31 – 1
(2 の 31乗 から -1)
なお、64ビット版PHPで2^32
を超えると、乱数が偶数寄りになるとマニュアルにも記載されています。
注意しましょう。
mt_randでファイル名をランダムに生成
ファイル名をそのままアップロードなどすると、セキュリティ上問題があったり、ファイル名が重複する場合もあるでしょう。
そんなときは、mt_rand()
の乱数にsha1
などのハッシュ値、UNIXタイムスタンプなどを組み合わせたファイル名にするなど、ランダムに他の名前とダブらないような名前になるようにします。
以下に2つのパターンをご紹介します。
1 2 3 4 5 6 7 8 9 10 |
// パターン1 // 現在時刻と乱数を組み合わせた文字列をsha1でハッシュ化 $fileName = sha1(time().mt_rand()); // パターン2 // 他と重複しない一意の乱数をsha1でハッシュ化 $fileName = sha1(uniqid(mt_rand(),true)); // jpg画像の拡張子をファイル名に付ける echo $fileName.'.jpg'; |
上記2パターンのサンプルは、以下のリンクを開いてご確認ください。
rand関数(非推奨)
rand()
は非推奨です。よりよい乱数値を生成するmt_rand()
を使いましょう。
1 2 3 |
// mt_randと使い方は変わらない echo rand(); echo rand(1, 6); |
ちなみに、rand()
の最大値を調べるにはgetrandmax()
を使いますが、Windowsなどの一部環境では最大値が32767
となります。
それ以上の乱数を生成したい場合は、最大値を設定するか、mt_rand()
を使うようにしましょう。
「よりよい」が「よりより」になってますよ
ホントですね!
大変失礼いたしました、訂正させていただきました。
ご指摘ありがとうございます。