【ぎじらんすうせいせいき】

擬似乱数生成器(PRNG) とは?

公開:
💡 同じ出発点と手順なら、同じ列を出す数の工場

内部の状態を決まった計算規則で更新し、ばらつきのある数列を作る仕組み。同じ初期状態・規則・呼び出し方なら列を再現でき、シミュレーションやテストなどに使われます。

📌 このページのポイント
同じ出発点なら、同じ列 学習用:5倍して1を足し、16で割った余り 初期値 1回目 2回目 3回目 1 6 15 12 1からやり直すと、また 6 → 15 → 12 この例では内部状態をそのまま出力 小さな学習用の例。秘密の生成には使わない
数の札は各時点の状態で、矢印は同じ計算規則による更新です。実用の生成器では状態から別の値を取り出す場合もあります。
ひよこ ひよこ
計算で作るのに、どうしてランダムに見えるの?
ペンギン先生 ペンギン先生
内部に覚えた状態を計算で更新して、ばらつきのある値を取り出すからだよ。出た値だけを見ると規則が分かりにくくても、同じ初期状態から同じ規則で動かせば、同じ列になるんだ。
ひよこ ひよこ
どんな計算なのか、簡単な例が見たいな。
ペンギン先生 ペンギン先生
学習用に「今の数を5倍して1を足し、16で割った余りを次の数にする」としよう。初期値が1なら、次は6、その次は15、その次は12だよ。これは仕組みを見るための小さな例で、秘密の番号には使わないんだ。
ひよこ ひよこ
同じ列が出ると、何がうれしいの?
ペンギン先生 ペンギン先生
テストや実験で同じ状況を作り直しやすいんだ。シードは初期状態を決める材料だよ。ただし、使う計算方式やバージョン、呼び出す順番が変われば、同じシードだけでは同じ結果になるとは限らないね。
ひよこ ひよこ
ずっと動かすと同じ列に戻るの?
ペンギン先生 ペンギン先生
状態の種類が有限で、途中で外から新しい状態を補わないなら、やがて同じ状態が現れて周期的になるよ。ただし周期が長いことと、攻撃者に予測されにくいことは別なんだ。
ひよこ ひよこ
パスワード再設定の番号にも使えるの?
ペンギン先生 ペンギン先生
秘密には、PRNGの中でも暗号用に設計されたCSPRNGを選ぶよ。Pythonの既定のrandomやJavaScriptのMath.randomは、その用途に向かないんだ。再現できる便利さと、他人に当てられにくい性質を区別するのが大事だね。
もっと詳しく知りたい人へ

Pythonで同じシードを指定すれば、バージョンが違っても同じ結果になる?

すべての関数について同じ結果になる保証はありません。公式文書は、互換のシード設定方法で同じシードを与えたrandom()の列について互換性を保証していますが、多くのアルゴリズムやシード設定関数はバージョン間で変更される可能性があります。実験ではバージョンと使った関数、呼び出し順も記録します。複数スレッドで同じ生成器を共有する場合は呼び出しの順序にも注意が必要です。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「PRNG」って出てきたら「内部状態と計算規則で乱数らしい列を作る仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Pseudorandom Number Generator」 = 擬似乱数生成器
💬 Pseudoは「擬似的な」という意味で、乱数のような列を計算で生成することを表す名前だよ

参考資料

← 用語集にもどる