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

【PHP8.x】Random\Engine\Xoshiro256StarStar::jump()メソッドの使い方

jumpメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

jumpメソッドは、Random\Engine\Xoshiro256StarStar クラスが提供する擬似乱数生成エンジンの内部状態を、特定の距離だけ前方に進める(スキップする)メソッドです。

Random\Engine\Xoshiro256StarStar は、PHP 8.2以降で利用できる、高速かつ高品質な擬似乱数を生成するエンジンの一つです。コンピューターが作り出す乱数は、実際には複雑な計算によって生成される「擬似乱数」であり、その生成過程には現在の状態を示す内部的な数値が関与しています。

jump メソッドを呼び出すと、この乱数生成エンジンの内部状態が、通常の乱数生成処理を数え切れないほど多く実行したかのように、はるか先の地点まで一気に更新されます。このジャンプの距離は非常に大きく、実質的に、元のシードから生成される長い乱数列の中の、重複する可能性が極めて低い全く異なる部分から乱数生成を再開することになります。

この機能は、特に複数の独立した乱数ストリームが必要な場合に有用です。例えば、並列処理を行う際に、各プロセスやスレッドがそれぞれ異なる独立した乱数シーケンスを必要とする場合があります。そのような状況で、同じ初期シードを持つ乱数エンジンに対して、各々が異なる回数 jump メソッドを実行することで、互いに干渉せず、統計的に独立した高品質な乱数ストリームを効率的に供給することが可能になります。これにより、信頼性の高いシミュレーションやテストデータの生成が実現できます。

構文(syntax)

1<?php
2
3$engine = new Random\Engine\Xoshiro256StarStar();
4$engine->jump();

引数(parameters)

引数なし

引数はありません

戻り値(return)

void

このメソッドは何も値を返しません。

サンプルコード

PHP Random Engine jump() で乱数シーケンスをスキップする

1<?php
2
3// PHP 8 の Random\Engine\Xoshiro256StarStar クラスにおける jump メソッドの使用例です。
4// このメソッドは、擬似乱数生成器の状態を「ジャンプ」させます。
5// これにより、乱数シーケンスの特定の大きな区間をスキップすることができます。
6
7function demonstrateEngineJump(): void
8{
9    // 再現性を確保するため、固定シードで乱数エンジンを初期化します。
10    $seed = 12345;
11    $engine = new Random\Engine\Xoshiro256StarStar($seed);
12
13    echo "--- jump() 呼び出し前の乱数 ---\n";
14    // jump() 呼び出し前にいくつかの乱数を生成し、初期シーケンスの一部を表示します。
15    for ($i = 0; $i < 3; $i++) {
16        echo "乱数 #" . ($i + 1) . ": " . $engine->nextInt() . "\n";
17    }
18
19    echo "\n--- jump() メソッドを呼び出し ---\n";
20    // jump() メソッドを呼び出すことで、エンジンの内部状態が大幅にスキップされます。
21    // この操作は、乱数シーケンスを決定論的に次の大きなセクションへ進めます。
22    $engine->jump();
23    echo "エンジンの状態がジャンプされました。\n";
24
25    echo "\n--- jump() 呼び出し後の乱数 ---\n";
26    // jump() 呼び出し後に乱数を生成すると、前のシーケンスとは全く異なる、
27    // しかし予測可能な次のシーケンスの乱数が生成されます。
28    for ($i = 0; $i < 3; $i++) {
29        echo "乱数 #" . ($i + 1) . ": " . $engine->nextInt() . "\n";
30    }
31}
32
33// 関数を実行します。
34demonstrateEngineJump();

PHP 8で導入された新しい擬似乱数生成器の一つに、Random\Engine\Xoshiro256StarStarクラスがあります。このクラスのjumpメソッドは、乱数生成器の内部状態を決定論的に「ジャンプ」させる機能を提供します。

jumpメソッドは引数を取らず、戻り値もありません(void)。このメソッドを呼び出すと、現在の乱数シーケンスから大幅にスキップし、予測可能な次の大きな区間へと乱数生成器の状態を進めることができます。

これにより、例えば複数の並行処理で独立した乱数ストリームが必要な場合や、乱数シーケンス内の特定の大きなセクションに素早く移動したい場合に非常に便利です。jumpを呼び出すことで、異なる開始点から乱数生成を継続できますが、この開始点は元のシードとjumpの回数によって常に予測可能です。

サンプルコードでは、最初にjumpメソッド呼び出し前の乱数をいくつか生成し、次にjumpを呼び出してエンジンの状態をスキップしています。その後再び乱数を生成することで、jumpによって乱数シーケンスが大きく変化していることを確認できます。

Random\Engine\Xoshiro256StarStar::jump()はPHP 8以降で利用できる、この乱数生成器固有の機能です。他のエンジンでは使用できません。引数も戻り値もなく、乱数を直接生成しません。呼び出すと内部状態が次の大きな区間へスキップされます。スキップ後の乱数取得にはnextInt()を別途呼び出します。大規模シミュレーションでの独立した乱数シーケンス利用に有用です。単に異なる乱数が必要なら、エンジン初期化かシード変更も検討してください。

PHP Xoshiro256StarStar jump()で乱数シーケンスをジャンプする

1<?php
2
3/**
4 * Random\Engine\Xoshiro256StarStar::jump() メソッドの動作を示すサンプルコード。
5 *
6 * このメソッドは、乱数生成器の内部状態を「ジャンプ」させます。
7 * これにより、現在の乱数シーケンスから、十分に離れた別の乱数シーケンスに遷移できます。
8 * 例えば、並列処理において、異なるスレッドやプロセスがそれぞれ独立した乱数シーケンスを
9 * 予測可能かつ効率的に取得したい場合に有用です。
10 *
11 * @link https://www.php.net/manual/ja/random-engine-xoshiro256starstar.jump.php
12 */
13function demonstrateXoshiro256StarStarJump(): void
14{
15    echo "--- Random\\Engine\\Xoshiro256StarStar::jump() のデモンストレーション ---\n";
16
17    // 1. Random\Engine\Xoshiro256StarStar エンジンを初期化します。
18    //    シード値を指定することで、再現可能な初期状態を作成します。
19    $engine = new Random\Engine\Xoshiro256StarStar(12345);
20
21    // 2. Random\Randomizer を使用して、エンジンから乱数を生成します。
22    $randomizer = new Random\Randomizer($engine);
23
24    echo "\n--- jump() メソッド呼び出し前 ---\n";
25    echo "最初の5つの乱数:\n";
26    for ($i = 0; $i < 5; $i++) {
27        // 0から1000の間の整数を生成
28        echo "- " . $randomizer->getInt(0, 1000) . "\n";
29    }
30
31    // 3. jump() メソッドを呼び出します。
32    //    これにより、乱数生成器の内部状態が大きく変化し、
33    //    次に生成される乱数のシーケンスが大きくジャンプします。
34    $engine->jump();
35    echo "\n--- jump() メソッド呼び出し後 ---\n";
36    echo "(乱数生成器の状態がジャンプしました)\n";
37    echo "次の5つの乱数:\n";
38    for ($i = 0; $i < 5; $i++) {
39        echo "- " . $randomizer->getInt(0, 1000) . "\n";
40    }
41
42    echo "\n--- 補足 ---\n";
43    echo "ご覧のように、jump() の呼び出し前後で生成される乱数シーケンスは全く異なります。\n";
44    echo "これは、乱数生成器の状態が大きくスキップされたためです。\n";
45}
46
47// 関数を実行してデモンストレーションを開始します。
48demonstrateXoshiro256StarStarJump();
49

PHP 8で利用できるRandom\Engine\Xoshiro256StarStar::jump()メソッドは、高品質な乱数を生成するエンジンの内部状態を「ジャンプ」させる機能を提供します。このメソッドは引数を取らず、戻り値もありません(void)。jump()を呼び出すと、現在の乱数シーケンスとは全く異なる、十分に離れた新しい乱数シーケンスへと内部状態が遷移します。

これにより、例えば複数のスレッドやプロセスが並行して動作するアプリケーションにおいて、それぞれが互いに独立し、かつ予測可能な乱数シーケンスを効率的に利用できるようになります。個々のスレッドが同じ初期シードから乱数生成を開始しても、それぞれがjump()を一度呼び出すことで、互いに重複しない異なる乱数系列を安全に生成できます。

サンプルコードでは、jump()メソッドを呼び出す前後で、Randomizerから生成される乱数のパターンが大きく変化していることが確認できます。これは、jump()によって乱数生成器の状態が大きくスキップされたためであり、このメソッドが乱数シーケンスの独立性を確保するのに役立つことを示しています。

このjumpメソッドは、PHPコード内の特定の行へ処理を飛ばす(gotoのような)機能ではありません。乱数生成器の内部状態を大きく前進させ、現在の乱数シーケンスとは異なる独立したシーケンスを生成するために利用します。主に複数の並列処理において、各処理が個別に予測可能な乱数シーケンスを必要とする場合に特に有用です。Random\Engine\Xoshiro256StarStarクラスに属するメソッドで、直接乱数を生成するのではなく、Random\Randomizerクラスと組み合わせて使用します。引数は不要で、呼び出すだけで乱数生成器の状態がジャンプし、次に生成される乱数のパターンが大きく変わる点にご注意ください。

関連コンテンツ