Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】srand()関数の使い方

srand関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

srand関数は、乱数生成器のシード(種)を初期化する関数です。コンピュータが生成する乱数は、実際には特定の計算アルゴリズムによって生成される「擬似乱数」であり、その計算の出発点となる値が「シード」です。srand関数でシード値を設定すると、その後にrand関数で取得される乱数の系列が固定されます。つまり、同じシード値を指定すれば、プログラムを何度実行しても常に同じ順番で同じ乱数が生成されるようになります。この性質は、デバッグの際など、乱数を使用した処理の結果を正確に再現したい場合に非常に役立ちます。引数にはシードとして使用したい整数値を渡します。なお、PHP 7.1.0以降では、rand関数が初めて呼び出される際に自動的にシードが設定されるため、通常はsrand関数を明示的に呼び出す必要はありません。現在では、より性能が高く、より良質な乱数を生成するmt_srand関数とmt_rand関数の使用が推奨されています。そのため、srand関数は、古いコードとの互換性を保つ必要がある場合や、意図的に乱数の再現性を確保したいといった特殊な状況でのみ使用されるのが一般的です。

構文(syntax)

1srand(123);

引数(parameters)

?int $seed = null, int $mode = MT_RAND_MT19937

  • ?int $seed = null: 乱数生成器のシード値を指定します。省略した場合、システム時刻などによって自動的に設定されます。
  • int $mode = MT_RAND_MT19937: 乱数生成に使用するアルゴリズムを指定します。MT_RAND_MT19937 は Mersenne Twister アルゴリズムです。

戻り値(return)

void

srand関数は、乱数生成器のシード値を設定します。この関数は値を返しません。

サンプルコード

PHP srand 関数で乱数を生成する

1<?php
2
3/**
4 * このサンプルコードは、PHP 8における srand() 関数の呼び出し方を示します。
5 *
6 * PHP 7.1.0 以降では、srand() およびそのエイリアスである mt_srand() 関数は効果がありません。
7 * 乱数ジェネレータは PHP が起動する際に自動的に安全な方法でシードされるため、
8 * これらの関数を明示的に呼び出す必要はありません。
9 * 以下のコードは、関数を呼び出す形式を示すためのものです。
10 */
11function demonstrateSrandFunction(): void
12{
13    echo "--- srand() 関数のデモンストレーション ---\n";
14    echo "注意: PHP 7.1.0 以降では srand() は乱数ジェネレータに影響を与えません。\n\n";
15
16    // srand() を呼び出して乱数ジェネレータをシードしようとします。
17    // 第一引数にシード値 (整数) を指定します。null を指定すると自動シードを試みますが、
18    // PHP 7.1.0 以降ではこの関数自体が無効化されているため、実際には効果がありません。
19    srand(12345);
20    echo "srand(12345) を呼び出しました。\n";
21
22    // いくつかの乱数を生成してみます。
23    // srand() が効果的であれば、同じシード値からは常に同じ乱数シーケンスが生成されますが、
24    // PHP 7.1.0 以降では自動シードにより、実行ごとに異なる結果になる可能性が高いです。
25    echo "生成された乱数 (1-100): " . mt_rand(1, 100) . "\n";
26    echo "生成された乱数 (1-100): " . mt_rand(1, 100) . "\n\n";
27
28    // 別のシード値で再度 srand() を呼び出してみます。
29    srand(67890);
30    echo "srand(67890) を呼び出しました。\n";
31
32    // 再度乱数を生成してみます。
33    echo "生成された乱数 (1-100): " . mt_rand(1, 100) . "\n";
34    echo "生成された乱数 (1-100): " . mt_rand(1, 100) . "\n\n";
35
36    echo "補足: 確定的な乱数シーケンスが必要な場合、またはよりセキュアな乱数が必要な場合は、\n";
37    echo "PHP 7 以降で推奨される `random_int()` や `random_bytes()` 関数、\n";
38    echo "または PHP 8.2 以降で導入された `Random\\Randomizer` クラスの使用を検討してください。\n";
39}
40
41// 関数を実行します。
42demonstrateSrandFunction();
43

srand()関数は、乱数ジェネレータの初期値(シード)を設定するために使用される関数です。引数$seedには乱数生成の基となる整数を指定し、nullを指定した場合はPHPが自動的にシードを設定しようとします。二つ目の引数$modeは乱数生成アルゴリズムを指定しますが、通常はデフォルト値のままで問題ありません。この関数はvoid型であり、呼び出しても何も値を返しません。

しかし、PHP 7.1.0以降では、srand()関数およびそのエイリアスであるmt_srand()関数を呼び出しても、実際には乱数ジェネレータに影響を与えません。PHPの起動時に、内部的に安全な方法で乱数ジェネレータが自動的にシードされるため、これらの関数を明示的に呼び出す必要がなくなりました。

このサンプルコードは、過去のバージョンのPHPにおけるsrand()関数の呼び出し方を示す形式的なものです。srand(12345)のようにシード値を指定して呼び出していますが、PHP 7.1.0以降の環境では、その後にmt_rand()で生成される乱数にこのシード値は影響しません。そのため、実行ごとに異なる乱数が生成される可能性が高いです。

現在、PHPでは、より予測不能でセキュアな乱数が必要な場合はrandom_int()random_bytes()関数、またはPHP 8.2以降で導入されたRandom\Randomizerクラスの利用が推奨されています。

このサンプルコードのsrand()関数は、PHP 7.1.0以降では乱数ジェネレータのシードに影響を与えません。PHPは起動時に自動で安全なシードを行うため、明示的にこの関数を呼び出す必要はありません。そのため、このコードは関数呼び出しの形式を示すためのものです。もし、確定的な乱数シーケンスを生成したい場合や、より安全な乱数が必要な場合は、random_int()random_bytes()関数、またはPHP 8.2以降で導入されたRandom\Randomizerクラスの使用を検討してください。現代のPHP開発においてsrand()を意図的に使用することはほとんど推奨されません。

PHP srandによる乱数生成器のシード設定

1<?php
2
3/**
4 * srand() 関数を使った乱数生成器のシード設定の動作を示すサンプルコードです。
5 * PHP 7.1.0以降、srand()はmt_srand()のエイリアスとなり、Mersenne Twister乱数ジェネレータのシードを設定します。
6 * これにより、rand() や mt_rand() が生成する乱数の系列を制御できます。
7 */
8function demonstrateRandomSeed(): void
9{
10    echo "--- シードを設定しない場合 (通常は実行ごとに異なる乱数) ---\n";
11    // srand() を呼び出さずに rand() を実行すると、PHP はデフォルトで現在の時刻などに基づいてシードします。
12    // そのため、通常はスクリプトを実行するたびに異なる乱数系列が生成されます。
13    echo "ランダムな数値 1: " . rand(1, 100) . "\n";
14    echo "ランダムな数値 2: " . rand(1, 100) . "\n\n";
15
16    echo "--- 特定のシードを設定した場合 (同じシードで同じ乱数系列) ---\n";
17    $seed = 12345;
18    echo "シード: " . $seed . " を使用して乱数を生成:\n";
19    // srand() を呼び出して乱数生成器のシードを設定します。
20    // これにより、同じシード値が使われる限り、rand() は同じ乱数系列を生成します。
21    srand($seed);
22    echo "ランダムな数値 A: " . rand(1, 100) . "\n";
23    echo "ランダムな数値 B: " . rand(1, 100) . "\n";
24    echo "ランダムな数値 C: " . rand(1, 100) . "\n\n";
25
26    echo "--- 同じシードを再度設定した場合 (同じ乱数系列が再び生成される) ---\n";
27    echo "シード: " . $seed . " を再度使用して乱数を生成:\n";
28    // 再び同じシードを設定すると、乱数生成器の状態がリセットされ、
29    // 最初のシード設定時と同じ乱数系列が最初から生成されます。
30    srand($seed);
31    echo "ランダムな数値 A': " . rand(1, 100) . "\n";
32    echo "ランダムな数値 B': " . rand(1, 100) . "\n";
33    echo "ランダムな数値 C': " . rand(1, 100) . "\n\n";
34
35    echo "--- 異なるシードを設定した場合 (異なる乱数系列) ---\n";
36    $anotherSeed = 67890;
37    echo "シード: " . $anotherSeed . " を使用して乱数を生成:\n";
38    // 異なるシードを設定すると、全く異なる乱数系列が生成されます。
39    srand($anotherSeed);
40    echo "ランダムな数値 X: " . rand(1, 100) . "\n";
41    echo "ランダムな数値 Y: " . rand(1, 100) . "\n";
42    echo "ランダムな数値 Z: " . rand(1, 100) . "\n\n";
43
44    echo "--- シードを null に設定した場合 (デフォルトのシード処理) ---\n";
45    echo "シード: null を使用して乱数を生成:\n";
46    // シードに null を渡すことは、srand() の呼び出しでシード引数を省略するのと同じで、
47    // デフォルトのシード処理(通常は現在の時刻に基づく)が行われます。
48    // そのため、このブロックを実行するたびに異なる結果になる可能性があります。
49    srand(null);
50    echo "ランダムな数値 N1: " . rand(1, 100) . "\n";
51    echo "ランダムな数値 N2: " . rand(1, 100) . "\n";
52}
53
54// 関数を実行して乱数生成のデモンストレーションを行います。
55demonstrateRandomSeed();

PHPのsrand関数は、乱数生成器のシード(種)を設定するために使用されます。PHP 7.1.0以降では、Mersenne Twisterアルゴリズムを採用しているmt_srand関数のエイリアスとして動作します。

この関数に整数値のシード($seed)を渡すことで、その後にrand()mt_rand()といった乱数生成関数が、同じシード値から常に同じ順序の乱数を生成するようになります。これにより、ゲームの再現性やテストデータの固定など、予測可能な乱数が必要な場合に非常に有用です。

引数$seedには乱数生成の開始点となる整数値を指定し、省略したりnullを渡したりした場合は、PHPがデフォルトで現在の時刻などに基づいてシードを設定するため、通常は実行ごとに異なる乱数系列が生成されます。もう一つの引数である$modeは乱数ジェネレータのアルゴリズムを指定しますが、通常はデフォルトのMT_RAND_MT19937が使用されます。

戻り値はvoidであり、特に値を返しません。サンプルコードでは、シードを設定しない場合と、同じシードまたは異なるシードを設定した場合に、rand()関数がどのように異なる乱数を生成するかが具体的に示されています。同じシードを再度設定すると、乱数系列がリセットされ、再び同じ順序で乱数が生成される挙動も確認できます。

srand()関数は、乱数生成器のシードを設定し、これにより毎回同じ乱数系列を生成できるため、乱数の再現性が必要な場面で活用できます。シードを設定しない場合やnullを渡した場合は、通常実行ごとに異なる乱数が生成されます。ただし、パスワードや暗号鍵などセキュリティが重要な場面では、予測可能な乱数になるためsrand()で固定シードを使うのは避けてください。そのような場合は、より強力なrandom_bytes()random_int()関数を使用することを強く推奨します。この関数はPHP 7.1.0以降、mt_srand()のエイリアスとして機能し、メルセンヌツイスターアルゴリズムに基づいています。

PHPのsrandrandで乱数系列を再現する

1<?php
2
3/**
4 * PHPのsrand関数とrand関数の基本的な使用例を示します。
5 * srand関数は乱数ジェネレータのシードを設定し、rand関数は乱数を生成します。
6 * 同じシードを設定することで、同じ乱数系列を再現できることを示します。
7 */
8
9// 1. シードを設定せずに乱数を生成します。
10// 実行ごとに異なる乱数が出力される可能性があります。
11echo "--- シードを明示的に設定しない場合 ---" . PHP_EOL;
12echo "乱数1: " . rand(1, 100) . PHP_EOL;
13echo "乱数2: " . rand(1, 100) . PHP_EOL;
14echo PHP_EOL;
15
16// 2. 特定のシード値を設定して乱数を生成します。
17// srand()関数に整数値を渡すことで、乱数ジェネレータをそのシードで初期化します。
18// 同じシード値を使用すると、以降に生成される乱数の系列は常に同じになります。
19$seedValue = 12345;
20srand($seedValue); // シードを設定
21
22echo "--- シード {$seedValue} を設定した場合(初回) ---" . PHP_EOL;
23echo "乱数1: " . rand(1, 100) . PHP_EOL;
24echo "乱数2: " . rand(1, 100) . PHP_EOL;
25echo "乱数3: " . rand(1, 100) . PHP_EOL;
26echo PHP_EOL;
27
28// 3. 同じシード値を再度設定して乱数を生成します。
29// シードを再設定すると、乱数ジェネレータは再び同じ系列の最初から乱数を生成します。
30srand($seedValue); // 同じシードを再設定
31
32echo "--- シード {$seedValue} を設定した場合(再設定後) ---" . PHP_EOL;
33// 上記「初回」と同じ乱数系列が出力されることを確認してください。
34echo "乱数1: " . rand(1, 100) . PHP_EOL;
35echo "乱数2: " . rand(1, 100) . PHP_EOL;
36echo "乱数3: " . rand(1, 100) . PHP_EOL;
37echo PHP_EOL;
38
39// 4. 異なるシード値を設定して乱数を生成します。
40// 異なるシード値を使用すると、異なる乱数系列が生成されます。
41$anotherSeedValue = 67890;
42srand($anotherSeedValue); // 異なるシードを設定
43
44echo "--- 異なるシード {$anotherSeedValue} を設定した場合 ---" . PHP_EOL;
45echo "乱数1: " . rand(1, 100) . PHP_EOL;
46echo "乱数2: " . rand(1, 100) . PHP_EOL;
47echo "乱数3: " . rand(1, 100) . PHP_EOL;
48echo PHP_EOL;
49

PHPのsrand関数は、乱数ジェネレータの「シード」と呼ばれる初期値を設定するために使われます。シードとは、乱数生成の出発点となる数値のことで、これを設定することで、以降に生成される乱数の系列をコントロールすることができます。この関数はvoidを返すため、直接的な戻り値はありません。

引数には$seedという整数値を指定します。この$seedに特定の値を渡すと、その値を使って乱数ジェネレータが初期化されます。もし$seedを省略するかnullを指定した場合、システムが自動的にシードを設定するため、実行ごとに異なる乱数系列が生成される可能性があります。

srand関数で一度シードを設定すると、その後rand関数などで生成される乱数は、そのシードに基づいた特定の系列に従って出力されます。そのため、同じシード値を何度設定しても、同じ乱数系列が繰り返し生成されるという特徴があります。これは、例えばゲームで毎回同じマップを再現したい場合や、特定のシミュレーション結果を繰り返し確認したい場合などに非常に役立ちます。

サンプルコードでは、まずシードを設定しない場合の乱数の変動に始まり、特定のシード値(例: 12345)を設定して同じ乱数系列が生成される様子が示されています。さらに、同じシードを再設定すると乱数系列が最初から繰り返されること、そして異なるシード(例: 67890)を設定すると全く異なる乱数系列が生成されることが確認できます。このように、シードが乱数系列の生成にどのように影響するかを具体的に理解することができます。

srand関数は、乱数ジェネレータの初期値を設定し、生成される乱数系列を決定します。同じシードを設定すると、常に同じ乱数系列が再現されるため、テストやデバッグで乱数の挙動を固定したい場合に便利です。しかし、予測可能な乱数はセキュリティ上の問題を引き起こすため、パスワードやトークンなど、予測不可能性が求められる場面では絶対に使用しないでください。そのような用途では、PHP 7以降で導入されたrandom_intrandom_bytesといった、より強力な暗号学的に安全な乱数生成関数を利用することを強く推奨します。明示的にシードを設定しない場合、通常はシステムが時刻などに基づいて自動的に異なる乱数系列を生成します。

関連コンテンツ

関連プログラミング言語