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

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

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

作成日: 更新日:

基本的な使い方

jumpLongメソッドはRandom\Engine\Xoshiro256StarStarクラスのインスタンスが保持する乱数生成器の内部状態を、現在の位置から大幅に未来へと進めるために使用されるメソッドです。

Random\Engine\Xoshiro256StarStarは、高速かつ高品質な疑似乱数を生成するためのエンジンです。このjumpLongメソッドを呼び出すと、内部的な乱数生成器の状態が、あらかじめ定義された特定の「ジャンプ」パターンに従って更新されます。これにより、次に生成される乱数のシーケンスは、jumpLongを呼び出す前とは全く異なるものになりますが、その後のシーケンスは予測可能です。

この機能は、主に複数の独立した乱数シーケンスを、同じ初期シード値から生成したい場合に役立ちます。例えば、並行処理を行うアプリケーションにおいて、各スレッドやプロセスがそれぞれ異なるが、それぞれ予測可能な乱数ストリームを利用したい場合に有用です。各処理の開始時にjumpLongメソッドを呼び出すことで、乱数生成器の状態を個別に分離し、互いに干渉することなく独立した乱数シーケンスを使用できます。

また、大規模なシミュレーションなどで特定の乱数生成フェーズをスキップし、後続の乱数シーケンスから処理を開始したい場合にも利用できます。jumpLongは単に多くの乱数を生成して捨てるのとは異なり、数学的に厳密に定義された方法で状態を更新するため、乱数ストリームの品質を維持しつつ、効率的に状態を遠くまで移動させることが可能です。これにより、プログラムの柔軟性と効率性が向上します。

構文(syntax)

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

引数(parameters)

引数なし

引数はありません

戻り値(return)

void

このメソッドは乱数生成器の状態を大きくジャンプさせ、乱数のシーケンスをリセットします。戻り値はありません。

サンプルコード

PHP Random::jumpLong で乱数シーケンスをジャンプさせる

1<?php
2
3/**
4 * Random\Engine\Xoshiro256StarStar::jumpLong メソッドの使用例を示します。
5 *
6 * このメソッドは、乱数エンジンの内部状態を「非常に遠く」にジャンプさせ、
7 * まったく異なる乱数シーケンスを開始するために使用されます。
8 * 主に、並列処理や分散システムで複数の独立した乱数ストリームが必要な場合に有用です。
9 */
10
11// 1. まず、乱数エンジン Random\Engine\Xoshiro256StarStar のインスタンスを作成します。
12//    これはPHP 8で導入された新しい乱数生成エンジンです。
13$engine = new Random\Engine\Xoshiro256StarStar();
14
15// 2. Randomizer クラスを使用して、このエンジンから乱数を生成するためのラッパーを作成します。
16//    Randomizer は、指定されたエンジンを使って様々な種類の乱数を生成する便利なAPIを提供します。
17$randomizer = new Random\Randomizer($engine);
18
19echo "--- jumpLong 呼び出し前の乱数 ---" . PHP_EOL;
20// 3. jumpLong を呼び出す前にいくつかの乱数を生成し、表示します。
21for ($i = 0; $i < 3; $i++) {
22    echo $randomizer->getInt(1, 100) . PHP_EOL; // 1から100の間の整数を生成
23}
24
25echo PHP_EOL;
26
27// 4. Random\Engine\Xoshiro256StarStar::jumpLong メソッドを呼び出します。
28//    これにより、エンジンの内部状態が大幅にスキップされ、次の乱数シーケンスが現在のものと
29//    統計的に独立した状態になります。
30$engine->jumpLong();
31
32echo "--- jumpLong 呼び出し後の乱数 ---" . PHP_EOL;
33// 5. jumpLong 呼び出し後に再度乱数を生成し、表示します。
34//    呼び出し前とは全く異なる乱数の並びが出力されるはずです。
35for ($i = 0; $i < 3; $i++) {
36    echo $randomizer->getInt(1, 100) . PHP_EOL; // 1から100の間の整数を生成
37}
38
39// 出力される乱数は実行ごとに異なりますが、jumpLong の前後でシーケンスが大きく変化することがわかります。
40
41?>

Random\Engine\Xoshiro256StarStar::jumpLong メソッドは、PHP 8 で導入された新しい乱数生成エンジンである Random\Engine\Xoshiro256StarStar クラスに属しています。このメソッドは、引数を一切取らず(引数なし)、特別な値を返しません(戻り値は void)が、乱数エンジンの内部状態を「非常に遠く」にスキップさせる重要な役割を持っています。

具体的には、現在の乱数シーケンスから統計的に独立した、まったく異なる新しい乱数シーケンスを開始するために使用されます。これは、特に並列処理を行うアプリケーションや分散システムにおいて、複数の独立した乱数ストリームが必要な場合に非常に有用です。例えば、複数のプロセスがそれぞれ固有の、互いに影響し合わない乱数を生成したいときに活用できます。

サンプルコードでは、まず Random\Engine\Xoshiro256StarStar のインスタンスを作成し、それをラッパーである Random\Randomizer クラスで利用しています。jumpLong メソッドを呼び出す前と後でそれぞれ乱数を複数回生成し表示することで、このメソッドが乱数エンジンの内部状態を大きく変化させ、その結果、呼び出し前とは全く異なる乱数の並びが出力される様子が示されています。これにより、jumpLong が独立した乱数シーケンスを生成する仕組みが視覚的に理解できるでしょう。

Random\Engine\Xoshiro256StarStar::jumpLongはPHP 8以降で利用可能な機能で、引数はなく戻り値もありません(void)です。このメソッドは、乱数エンジンの内部状態を決定論的に「非常に遠く」へジャンプさせ、現在のものとは統計的に独立した新しい乱数シーケンスを開始します。主に並列処理や分散システムで、複数の独立した乱数ストリームが必要な場合に有効です。乱数をリセットするのではなく、予測可能な遠い状態へ遷移するため、異なる処理間での乱数シーケンス重複を防ぎます。通常の乱数生成では不要な操作ですので、利用の目的を明確にして活用してください。

PHP Random::jumpLongで乱数列を大きく進める

1<?php
2
3/**
4 * PHP の Random\Engine\Xoshiro256StarStar::jumpLong() メソッドの
5 * 動作を示すサンプルコードです。
6 *
7 * このメソッドは、乱数生成器の内部状態を「非常に長い距離」だけ進めます。
8 * これにより、例えば異なるプロセスやスレッドで、互いに重複しない独立した
9 * 乱数列を簡単に生成したい場合に利用できます。
10 *
11 * 注意: このクラスおよびメソッドは PHP 8.2 以降で利用可能です。
12 *       PHP 8.0 や 8.1 では動作しません。
13 */
14function demonstrateXoshiro256StarStarJumpLong(): void
15{
16    // 固定のシード(種)で乱数エンジンを初期化します。
17    // 同じシードからは、通常であれば同じ乱数列が生成されます。
18    $seed = 12345;
19    $engine = new Random\Engine\Xoshiro256StarStar($seed);
20    // Randomizer クラスは、指定されたエンジンを使用して様々な乱数を生成するための
21    // 便利なインターフェースを提供します。
22    $randomizer = new Random\Randomizer($engine);
23
24    echo "--- jumpLong メソッド呼び出し前の乱数 ---\n";
25    echo "1番目の乱数: " . $randomizer->getInt(0, 100) . "\n";
26    echo "2番目の乱数: " . $randomizer->getInt(0, 100) . "\n";
27    echo "3番目の乱数: " . $randomizer->getInt(0, 100) . "\n";
28
29    // ここで jumpLong メソッドを呼び出し、乱数生成器の状態を大きく進めます。
30    // このメソッドは内部状態を変更するだけで、戻り値はありません(void)。
31    $engine->jumpLong();
32    echo "\n--- jumpLong メソッド呼び出し後(状態が大きく進んだ後)の乱数 ---\n";
33    echo "1番目の乱数 (ジャンプ後): " . $randomizer->getInt(0, 100) . "\n";
34    echo "2番目の乱数 (ジャンプ後): " . $randomizer->getInt(0, 100) . "\n";
35    echo "3番目の乱数 (ジャンプ後): " . $randomizer->getInt(0, 100) . "\n";
36
37    echo "\n<解説>\n";
38    echo "ご覧のように、jumpLong() を呼び出すことで、\n";
39    echo "乱数生成器は次の乱数を生成する位置を、通常の連続生成では到達しないような\n";
40    echo "非常に遠い場所へスキップします。これにより、前後の乱数列が\n";
41    echo "完全に異なるものになっていることが確認できます。\n";
42}
43
44// 関数を実行して動作を確認します。
45demonstrateXoshiro256StarStarJumpLong();
46

PHPのRandom\Engine\Xoshiro256StarStar::jumpLong()メソッドは、PHP 8.2以降で利用可能な乱数生成エンジンであるRandom\Engine\Xoshiro256StarStarクラスに属するメソッドです。このメソッドは引数を取らず、戻り値もありません(void)。その主な機能は、乱数生成器の現在の内部状態を、通常の乱数生成では到達しないような「非常に長い距離」だけ前方にスキップさせることです。

この機能は、同じシード値で初期化された複数の乱数生成器が、互いに完全に独立した乱数列を生成したい場合に特に役立ちます。例えば、異なるプロセスやスレッドで乱数を使用する際に、jumpLong()を呼び出すことで、乱数系列の重複や干渉を気にすることなく、それぞれが独自の長い乱数列を利用できるようになります。サンプルコードが示すように、このメソッドを呼び出す前後で生成される乱数は大きく異なり、乱数生成器の状態が大幅にジャンプしたことを明確に示しています。

PHP 8.2以降の環境でのみ動作します。PHP 8.0や8.1など古いバージョンではこのクラスやメソッドは存在しないため、必ずPHPのバージョンを確認してください。jumpLong()メソッドは引数を持たず、戻り値もありません(void)。このメソッドは、乱数生成器の内部状態を通常の数万回〜数十万回分に相当する「非常に長い距離」だけ一気に進める役割があります。直接値を返しませんが、呼び出すことで乱数生成器の状態が大きく変化し、その後の乱数列は完全に異なるものとなります。複数のプロセスやスレッドで、互いに重複しない独立した乱数列を生成したい場合に利用すると効果的です。

関連コンテンツ

関連プログラミング言語