最終更新日:
公開日:
レシピ
数値
ランダムな数値を作成する
random_int関数やmt_rand関数を使ってランダムな数値を作成する方法について解説します。
この記事のポイント
- 「0〜100」など指定した範囲でランダムな数値を作成する
- 暗号学的にランダムな数値を作成するときはrandom_int関数を使う
- 範囲を指定しないでランダムな数値を作成するときはmt_rand関数を使う
目次
ランダムな数値の作り方
PHPではランダムな数値(乱数)を作る関数がいくつか用意されております。
今回はその中でも代表的なrandom_int関数とmt_rand関数を使った方法を解説していきます。
暗号学的に安全なランダムな数値を作りたいときはrandom_int関数を使いますが、こちらの関数は数値の範囲を必ず指定する必要があります。
もう1つのmt_rand関数は数値の範囲を指定せずに使うことができ、random_int関数と同様に数値の範囲をして使うこともできます。
もし範囲を指定しないときは、0からmt_getrandmax関数で取得できる範囲の数値からランダムな数値を作成します。
以降はそれぞれの関数を使用例をみていきます。
random_int関数でランダムな数値を作る
random_int関数は最小値と最大値の2つをパラメータで指定して実行します。
範囲を指定しなかったり、最小値が最大値よりも大きい値を指定してしまった場合はエラーになります。
コード例
random_int( 0, 10);
以下の例ではfor文でrandom_int関数を10回実行し、作成した数値をvar_dump関数で出力します。
コード例
<?php
for($i=0; $i<10; $i++) {
var_dump(random_int( 0, 10));
}
// var_dump関数による出力結果
int(5)
int(4)
int(4)
int(9)
int(5)
int(1)
int(1)
int(6)
int(6)
int(1)
mt_rand関数でランダムな数値を作る
mt_rand関数はパラメータなしで呼び出すか、最小値と最大値の2つのパラメータを指定して実行します。
パラメータを指定しない
パラメータを指定しない場合は、0からmt_getrandmax関数で取得できる範囲の数値からランダムに数値を取り出します。
mt_getrandmax関数が返す数値はPHPの実行環境によって異なる可能性があるため、意図した範囲の数値を取得したい場合はパラメータを指定した方が確実です。
コード例
mt_rand();
例えばmt_getrandmax関数で取得した値が2147483647の環境であれば、ランダムな数値も0〜2147483647の間で作成することができます。
続いて以下の例では、for文でmt_rand関数を10回実行して作成したランダムな数値をvar_dump関数で出力します。
コード例
<?php
for($i=0; $i<10; $i++) {
var_dump(mt_rand());
}
// var_dump関数による出力結果
int(990834765)
int(2041963542)
int(1699905824)
int(1369671777)
int(1654998204)
int(1901554317)
int(399800514)
int(1072433853)
int(1867424030)
int(1862154737)
パラメータを指定する
続いて、パラメータを指定してランダムな数値を作成してみましょう。
以下の例では最小値を0、最大値を10に指定することで0〜10の範囲でランダムな数値を作成します。
コード例
mt_rand( 0, 10);
もしパラメータを1つしか指定しなかった場合、または2つ目のパラメータ(最大値)よりも1つ目のパラメータ(最小値)が大きい場合は実行エラーになります。
以下の例では取得する数値の範囲を0〜10と指定してfor文で10回実行して出力します。
コード例
for($i=0; $i<10; $i++) {
var_dump(mt_rand( 0, 10));
}
// var_dump関数による出力結果
int(0)
int(2)
int(3)
int(7)
int(8)
int(5)
int(9)
int(8)
int(2)
int(10)
Note
ランダムな数値を作成する関数によく似た名前のrand関数があります。
PHP7.1以降ではrand関数はmt_rand関数のエイリアスになっており、全く同じ動作をするため新しくコードを書くときは基本的にmt_rand関数を使うことをお薦めします。
PHP7.0以前の環境ではランダムな数値を作成するときに使う乱数生成器が関数によって異なりますが、mt_rand関数の方が高速に動作するため、特別な理由がある場合を除きmt_rand関数の方がお薦めです。
ランダムな文字列を生成する
random_int関数と配列を組み合わせて、セッションのようなランダムな文字列を生成してみましょう。
コード例
// 変数の初期化
$res = null; // 生成した文字列を格納
$string_length = 10; // 生成する文字列の長さを指定
$base_strings = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0,1,2,3,4,5,6,7,8,9];
for( $i=0; $i<$string_length; $i++ ) {
$res .= $base_strings[random_int( 0, count($base_strings)-1)];
}
var_dump($res); // string(10) "zYcX6PCJP8"
$base_stringsには配列で大文字・小文字のアルファベットと数字が入っています。
この配列からrandom_int関数を使って0〜(配列の長さ−1)の範囲でランダムな数値を作成し、配列からランダムな1文字を取得します。
こちらの処理を$string_lengthで指定した回数だけ実行し、任意の長さのランダムな文字列を取得しています。
以上、ランダムな数値を作成する方法についてでした。