PHPのmt_srand()関数とは?乱数生成器へのシード設定方法を解説
PHPには複数の乱数生成関数が用意されていますが、その品質と再現性を左右するのがシード(seed)と呼ばれる初期値です。本記事では、メルセンヌ・ツイスタ方式の乱数生成器を初期化するための mt_srand() 関数について、基本構文から具体的な使用例まで詳しく解説します。
mt_srand()関数の定義と役割
関数名の先頭にある「mt」は「Mersenne Twister(メルセンヌ・ツイスタ)」の略です。mt_srand()関数は、メルセンヌ・ツイスタ方式の乱数生成器に対してシード値を設定し、乱数生成器を初期化するために使用されます。
多くの乱数生成器は動作前に初期化が必要ですが、PHPではmt_srand()の呼び出しは必須ではなく、省略した場合でも自動的にシードが設定される仕組みになっています。ただし、同じ乱数列を意図的に再現したいテストやシミュレーションなどでは、固定のシード値を指定して明示的に呼び出すことが有効です。
なお、この関数には戻り値がありません。
構文
mt_srand ([ int $seed [, int $mode = MT_RAND_MT19937 ]] ) : void
パラメータ
| 番号 | パラメータと説明 |
|---|---|
| 1 | seed 乱数生成器の初期化に使用する整数値。省略した場合はランダムな値が自動的に設定されます。 |
| 2 | mode 乱数生成の実装モードを以下の定数で指定します。 MT_RAND_MT19937:修正済みの正しいメルセンヌ・ツイスタ実装を使用 MT_RAND_PHP:古いPHPの互換実装を使用 |
戻り値
この関数はいかなる値も返しません。
対応するPHPバージョン
この関数はPHP 4.x、PHP 5.x、PHP 7.xのすべてのバージョンで利用可能です。なお、PHP 7.1.0以降ではsrand()がmt_srand()のエイリアスとなり、両者は同一の動作をするようになりました。
使用例1:固定シード値による初期化
次の例では、mt_rand()関数を使う前に、固定のシード値「5」で乱数生成器を初期化しています。
<?php
mt_srand(5);
echo "mt_rand(1,100)=", mt_rand(1,100);
?>
出力結果
mt_rand(1,100)=12
同じシード値を指定すれば、何度実行しても同じ乱数が得られます。これは乱数列の再現が必要なデバッグや単体テストで非常に便利です。
使用例2:現在時刻をシードとして利用
次の例では、time()関数で取得した現在のタイムスタンプをシードとして乱数生成器を初期化しています。
<?php
mt_srand(time());
echo "mt_rand()=", mt_rand();
?>
出力結果
mt_rand()=548287992
実行するたびに時刻が変わるため、毎回異なる乱数が生成されます。
まとめ
mt_srand()関数は、メルセンヌ・ツイスタ乱数生成器のシードを設定するための関数です。通常の用途では自動的にシードが設定されるため省略可能ですが、乱数列の再現性が必要な場面では固定シードを、逆に予測困難な乱数が必要な場面では時刻などをシードとして活用するとよいでしょう。
-
PHPのlcg_value()関数とは?乱数生成の基本と使い方を解説
lcg_value()関数の定義と使い方lcg_value()関数は、0から1までの範囲でランダムな数値(浮動小数点数)を生成するPHP組み込み関数です。「LCG」とは「線形合同法(Linear Congruential Generator)」の略称です。この手法は、不連続な区分線形方程式を用いて擬似乱数列を計算するアルゴリズムで、擬似乱数生成アルゴリズムの中でも最も古くから知られているものの一つです。構文lcg_value ( void ) : floatパラメータこの関数は引数を受け取りません。戻り値lcg_value()関数は、0.0以上1.0以下の範囲にある擬似乱数のfloat値を返し
-
PHPのmt_srand()関数とは?使い方とサンプルコードを解説
mt_srand()関数は、PHPで使用されるメルセンヌ・ツイスタ(Mersenne Twister)乱数生成器にシード(種)を設定するための関数です。シード値を指定することで、乱数の生成パターンを初期化し、再現性のある乱数列を作り出すことができます。注意: PHP 4.2.0以降では、乱数生成器が自動的にシードされるようになったため、現在ではこの関数を明示的に呼び出す必要はありません。構文mt_srand(seed)パラメータseed − 乱数生成器に設定するシード値戻り値mt_srand()関数は、何も値を返しません。使用例<?php mt_srand(mktime());