【ぎじらんすうせいせいき】
擬似乱数生成器(PRNG) とは?
公開:
💡 同じ出発点と手順なら、同じ列を出す数の工場
内部の状態を決まった計算規則で更新し、ばらつきのある数列を作る仕組み。同じ初期状態・規則・呼び出し方なら列を再現でき、シミュレーションやテストなどに使われます。
📌 このページのポイント
計算で作るのに、どうしてランダムに見えるの?
内部に覚えた状態を計算で更新して、ばらつきのある値を取り出すからだよ。出た値だけを見ると規則が分かりにくくても、同じ初期状態から同じ規則で動かせば、同じ列になるんだ。
どんな計算なのか、簡単な例が見たいな。
学習用に「今の数を5倍して1を足し、16で割った余りを次の数にする」としよう。初期値が1なら、次は6、その次は15、その次は12だよ。これは仕組みを見るための小さな例で、秘密の番号には使わないんだ。
同じ列が出ると、何がうれしいの?
テストや実験で同じ状況を作り直しやすいんだ。シードは初期状態を決める材料だよ。ただし、使う計算方式やバージョン、呼び出す順番が変われば、同じシードだけでは同じ結果になるとは限らないね。
ずっと動かすと同じ列に戻るの?
状態の種類が有限で、途中で外から新しい状態を補わないなら、やがて同じ状態が現れて周期的になるよ。ただし周期が長いことと、攻撃者に予測されにくいことは別なんだ。
パスワード再設定の番号にも使えるの?
秘密には、PRNGの中でも暗号用に設計されたCSPRNGを選ぶよ。Pythonの既定のrandomやJavaScriptのMath.randomは、その用途に向かないんだ。再現できる便利さと、他人に当てられにくい性質を区別するのが大事だね。
もっと詳しく知りたい人へ
Pythonで同じシードを指定すれば、バージョンが違っても同じ結果になる?
すべての関数について同じ結果になる保証はありません。公式文書は、互換のシード設定方法で同じシードを与えたrandom()の列について互換性を保証していますが、多くのアルゴリズムやシード設定関数はバージョン間で変更される可能性があります。実験ではバージョンと使った関数、呼び出し順も記録します。複数スレッドで同じ生成器を共有する場合は呼び出しの順序にも注意が必要です。
まとめ:ざっくりこれだけ覚えればOK!
「PRNG」って出てきたら「内部状態と計算規則で乱数らしい列を作る仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Pseudorandom Number Generator」 = 擬似乱数生成器
💬 Pseudoは「擬似的な」という意味で、乱数のような列を計算で生成することを表す名前だよ