【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 * 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 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()を意図的に使用することはほとんど推奨されません。

関連コンテンツ

【PHP8.x】srand関数の使い方 | いっしー@Webエンジニア