コンピュータ上でよく使われる「乱数」。実は私たちが普段目にしている乱数のほとんどは、本当の意味での“ランダム”ではありません。パソコンやスマートフォンで生成される乱数は、正確には「疑似乱数」と呼ばれるものです。本記事では、「なぜパソコンで本物の乱数は作れないのか?」、「疑似乱数とは何か?」、「その仕組みや限界」について、わかりやすく解説します。普段何気なく使っている乱数の裏側には、意外と深い仕組みや工夫が隠されているのです。
乱数とは何か?
まず、乱数とは何かをおさらいしましょう。乱数とは「規則性がなく、どの値が出るか予測できない数」のことを指します。たとえば、サイコロを振ったときに出る目や、くじ引きの当たり番号などが乱数の代表的な例です。
自然界における乱数は、物理的な現象や人間の手で生み出されます。たとえばサイコロを投げる行為は、初速や力加減、空気抵抗など無数の要素が絡み合い、出る目が完全に予測できません。これが「真の乱数(真性乱数)」と呼ばれるものです。
一方、コンピュータで乱数を使う場面はとても多いです。例えば、ゲームのアイテム抽選、セキュリティ分野のパスワード生成、統計やシミュレーションなどさまざまな分野で利用されています。
コンピュータは本物の乱数を作れない理由
それでは、なぜパソコンでは本当の乱数を作れないのでしょうか?理由はシンプルで、「コンピュータは論理的な計算機」だからです。
パソコンはすべての処理を論理的な手順、つまりプログラム(アルゴリズム)に従って実行しています。0と1という2進数で動くコンピュータにとって、「完全に予測不可能な数字」を自力で生み出すことは原理的にできません。
たとえば、「1+1=2」のように、入力に対して必ず決まった出力が返ってくるのがコンピュータの本質です。そのため、何らかの法則や計算式を使って「見かけ上ランダムに見える数」を生成しています。これが「疑似乱数(Pseudo Random Number)」です。
疑似乱数とは何か?
疑似乱数は「疑似的な乱数」、つまり本当の乱数を“まねた”数列のことです。英語ではPseudo Random Number Generator(PRNG)と呼ばれます。
PRNGは、ある「初期値(シード値)」を元に、一定の計算式(アルゴリズム)で数列を生成します。ぱっと見は不規則に見えますが、実は計算式に従って作られているので、同じシード値であればまったく同じ乱数列が再現できます。
たとえば以下のようなイメージです。
| シード値 | 疑似乱数の出力例 |
|---|---|
| 123 | 0.234, 0.985, 0.102, … |
| 456 | 0.541, 0.679, 0.888, … |
| 123 | 0.234, 0.985, 0.102, … |
このように、シード値が同じだと結果も同じになります。これはコンピュータが本質的に“決定論的”な存在であるためです。
代表的な疑似乱数生成アルゴリズム
疑似乱数生成アルゴリズムにはさまざまな種類があります。代表的なものをいくつか紹介します。
線形合同法(Linear Congruential Generator: LCG)
もっともシンプルで歴史あるアルゴリズムです。下記の式を繰り返すことで新しい乱数を生成します。
X(n+1) = (a × X(n) + c) mod m
- X(n):n回目の乱数
- a, c, m:定数
- mod:余りを計算する演算
この方式は高速で、昔からよく使われていますが、周期が短く、ある程度パターンが予測されやすいという欠点があります。
メルセンヌ・ツイスタ(Mersenne Twister)
現在多くのプログラミング言語(Python, Ruby, C++など)の乱数ライブラリで採用されている高性能な疑似乱数生成器です。1997年に松本眞・西村拓士によって開発されました。
- 非常に長い周期(2^19937−1)
- 高い統計的品質
- 計算速度も速い
ゲームやシミュレーションなど、多くの用途で「実用的なランダムさ」を提供してくれます。
疑似乱数の限界
疑似乱数はあくまで「見かけ上ランダム」なだけで、本物の乱数とは異なります。そのため、次のような限界があります。
完全な予測不能性がない
同じシード値を使うとまったく同じ乱数列が再現できるため、シード値やアルゴリズムが知られてしまうと、理論的にはすべての乱数が予測可能です。
セキュリティ用途には注意が必要
パスワード生成や暗号化など、「絶対に予測されたくない」用途では、疑似乱数だけを使うのは危険です。もしシード値やアルゴリズムが漏れた場合、大きなセキュリティリスクにつながります。
このため、暗号用途では「CSPRNG(Cryptographically Secure Pseudo Random Number Generator)」と呼ばれる、より安全な疑似乱数生成器が用いられています。これらは「統計的なランダムさ」だけでなく「予測困難性」を重視しています。
周期性の問題
どんなアルゴリズムでも、疑似乱数は最終的に“同じ繰り返し”になってしまいます(これを周期といいます)。周期が短いと、長時間使っているうちに同じパターンが現れやすくなり、不自然な結果になることもあります。
本物の乱数を作るには? ― ハードウェア乱数生成器
「じゃあ本物の乱数(真性乱数)を使いたい場合はどうするの?」と思われるかもしれません。実際、本物の乱数が必要な場合には、「ハードウェア乱数生成器(TRNG: True Random Number Generator)」が使われます。
ハードウェア乱数生成器は、物理的なノイズ(たとえば半導体内の熱雑音や放射線、光の揺らぎなど)を利用して、コンピュータの外部から“本物のランダム”を取り入れます。これにより、計算だけでは絶対に作れない「純粋な予測不可能性」を得ることができます。
最近のパソコンやスマートフォンには、セキュリティチップや専用デバイスとしてこのようなTRNGが内蔵されていることも増えてきました。
日常の用途で「疑似乱数」は十分?
ここまで「疑似乱数は本当の乱数じゃない!」と強調してきましたが、実は多くの用途では「疑似乱数で十分」というのが現実です。
たとえば、ゲームのアイテム抽選やシミュレーションのサンプリング、グラフ描画、データのシャッフルなど、予測されても特に困らない用途では、メルセンヌ・ツイスタなどの高速な疑似乱数でまったく問題ありません。
ただし、セキュリティや暗号化の分野、極めて高精度な統計解析など、「少しでも予測可能性があると致命的」な分野では、CSPRNGやTRNGの利用が必須となります。
まとめ:パソコンの乱数は「疑似」だけど、賢く使えばOK
- パソコンで生成される乱数は「疑似乱数(PRNG)」がほとんど
- 本物の乱数(真性乱数)は原理的に計算だけでは作れない
- 疑似乱数は、同じシード値から同じ値が再現できる「決定論的な乱数」
- セキュリティや予測困難性が必要な場面では、CSPRNGやハードウェア乱数生成器(TRNG)を活用
- 普通のアプリやゲーム用途なら疑似乱数で十分な品質を持っている
「乱数」と一口に言っても、その背景には複雑で面白い技術があります。自分が使っている乱数がどんな種類なのか、その特性を知った上で、用途に応じて賢く使い分けていくことが大切です。

コメント