擬似乱数のソースを表示
←
擬似乱数
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{出典の明記|date=2016年9月23日 (金) 04:47 (UTC)}} '''擬似乱数'''(ぎじらんすう、''{{lang|en|pseudorandom numbers}}'')は、[[乱数列]]のように見えるが、実際には確定的な計算によって求めている'''擬似乱数列'''による乱数。擬似乱数'''列'''を生成する機器を'''擬似乱数列生成器'''、生成[[アルゴリズム]]を'''擬似乱数列生成法'''と呼ぶ。 真の乱数'''列'''は本来、規則性も再現性もないものであるため、<!--その定義から、-->本来は確定的な計算によって求めることはできない(例:サイコロを振る時、今までに出た目から次に出る目を予測するのは不可能)。一方、擬似乱数'''列'''は確定的な計算によって作るので、その数列は確定的であるうえ、生成法と内部状態が既知であれば、予測可能でもある。 ある擬似乱数列を、真の乱数列とみなして良いかを確実に決定することはできない。シミュレーション等の一般的な用途には、対象とする乱数列の<!--さまざまな主として-->統計的な性質が、使用対象とする目的に合致しているかどうかを判断する。これを'''検定'''と言い、各種の方法が提案されている。<!--真の乱数列のそれと同じ(見分けがつかない)かどうかで、その乱数列の判断することになるが、これを--> しかし、特に暗号に使用する擬似乱数列については注意が必要であり、<!--他の用途とは異なる注意が必要である。一般に、一般の-->シミュレーション等には十分な<!--性能を持った-->擬似乱数列生成法であっても、[[暗号]]にそのまま使用できるとは限らない。暗号で使用する擬似乱数列については[[#暗号論的擬似乱数|暗号論的擬似乱数の節]]および[[暗号論的擬似乱数生成器|暗号論的擬似乱数生成器の記事]]を参照。 == 用途 == シミュレーション実験や、(暗号論的擬似乱数は)暗号などに利用されている。真に良質な乱数列を得ようとするのは意外に厄介であるのに対し、擬似乱数では前提条件が同じならば、<!--初期状態から始めれば、-->まったく同じ乱数列を生成できる。このため、シミュレーション等においては同じ動作を再現できるメリットがあるうえ、<!--シミュレーション自体のみならず、-->デバッグも可能となる。 なお、暗号生成の際、再現性を利用してシード値の選択を意図的に行われたりすると危険があるといった場合、何らかの方法でそれを排除することが必要な([[楕円曲線暗号]]のパラメータ生成など)用途もある。 == 主な擬似乱数生成法 == 様々な擬似乱数生成法が知られている。 *一般的生成法(方式と過去の出力が既知であれば、未来の出力を予測可能) **古典的<ref group="注釈">現代では通常使われない</ref>生成法 - 平方採中法 **比較的古い<ref group="注釈">1980年代以前から使われている</ref>生成法 - [[線形合同法]](乗算合同法・混合合同法)、[[線形帰還シフトレジスタ]]([[M系列]]) **比較的新しい<ref group="注釈">1990年代以降に提案された</ref>生成法 - [[メルセンヌ・ツイスタ]]、[[キャリー付き乗算]]、[[Xorshift]]、[[Lagged Fibonacci 法]]<!--、カオス乱数--><!--←カオスについて、古典的方法に比べて良い乱数が得られるする出典があるまでは外して良いでしょう-->、[[RANLUX]]、[[Permuted congruential generator]]、[[64ビット最適均等分布F2-線形発生法]] *[[暗号論的擬似乱数生成器|暗号学的に安全な生成法]](方式と過去の出力から未来の出力が{{仮リンク|予測可能性|en|predictability|label=予測困難}}で、現在の状態から過去の出力が{{仮リンク|予測可能性|en|predictability|label=予測不可能}})<!-- 有限の周期が存在する実装では「条件付き」で「実用上」は予測不可能であるが完全に「予測不可能」とはならない。 --> **BBS([[Blum-Blum-Shub]])、Fortuna *(参考)擬似乱数ではない、真の乱数の生成法 **[[ハードウェア乱数生成器]] - [[サイコロ]]、[[熱雑音]]、[[宇宙線]]などを利用する物理乱数 === 平方採中法 ({{en|middle-square method}}) === もっとも古い手法で、1946年頃、[[ジョン・フォン・ノイマン|ノイマン]]が提案した。[[The Art of Computer Programming|TAOCP]]の新しい訳本では二乗中抜き法と呼んでいる。 まず、適当に初期値を決める。以下、その(乱)数を 2 乗した値の中央にある必要な桁数を採って次の乱数とする。これを繰り返して乱数列とする方法。ここで「中央」とは、求まった値を必要な桁数の 2 倍の桁数として見た時の中央である。たとえば、4 桁を必要としていて、求まった値が 7 桁の時は、最上位の前の位(千万の位)に「0」を付け足して 8 桁とする(下の例を参照)。 (例)4 桁の擬似乱数を作ってみる。初期値を1763とする。 :1763<sup>2</sup> = 03'''1081'''69 → 1081 :1081<sup>2</sup> = 01'''1685'''61 → 1685 :1685<sup>2</sup> = 02'''8392'''25 → 8392 :8392<sup>2</sup> = 70'''4256'''64 → 4256 :4256<sup>2</sup> = 18'''1135'''36 → 1135 :… こうして、擬似乱数列 {1763, 1081, 1685, 8392, 4256, 1135, …} を得る。 <!--丁度中央にある丁度半分の桁数を取り出すことに数理的理由があるわけではないので、奇数桁取り出すような実装に問題はない、ためコメントアウト MetaNest → --><!--平方採中法は偶数桁を採る時にしか使えない。また、-->計算の結果、過去に現れた数と同じ数が現れればループとなり、その長さを周期と言うが、線形合同法を使えば周期が最長のものが理論的に可能であるため、現代において平方採中法が利用されることはまずない。<!-- [[線形合同法]]という記事があったので、コメントアウト == 線形合同法({{en|linear congruential method}}) == 1948年、レーマが提案 適当な初期値<math>X_0</math>と、適当な定数<math>a</math>,<math>b</math>,<math>m</math>を定める。 <math>X_i = a X_{i-1} + b \mod m</math> として、<math>X</math> を乱数列とする。 --> === 線形合同法 ({{en|linear congruential method}}) === {{Main|線形合同法}} 線形合同法の :<math>X_{n+1}=\left(A\times X_n+B\right)\bmod M</math> において、B=0 の場合を区別して特に乗算合同法、B>0 の場合を区別して特に混合合同法と言うことがある。<!-- 下の式に適当な ''a''、''p''、''q'' を代入する(必要な桁数が採れれば何でも良い)。求まった ''a'' の中間あたりの必要な桁数を乱数として採用し、それを新たな ''a'' として、再び下の式に代入する。 :''ap'' + ''q'' = ''a' '' (例)5 桁の擬似乱数を作ってみる。ただし、最初は ''a'' = 14992、''p'' = 673、''q'' = 944とし、求まった ''a' '' の、十の位から十万の位までを採用することとする。 :14992×673+944 = 10090560 → 09056 :09056×673+944 = 06095632 → 09563 :09563×673+944 = 06436843 → 43684 :43684×673+944 = 29400276 → 40027 :40027×673+944 = 26939115 → 93911 :… こうして、擬似乱数列 {14992, 9056, 9563, 43684, 40027, 93911, …} を得る。 --> === 線形帰還シフトレジスタ === {{Main|線形帰還シフトレジスタ}} [[線形帰還シフトレジスタ]] ({{en|Linear Feedback Shift Register, LFSR}}) はデジタル回路を用いて容易に実装することができる。特性多項式を適切に選択することによって、等頻度性、無相関性及び周期が保証される。乱数としては最長周期を保証する[[M系列]]を使う。 == 新しい擬似乱数生成アルゴリズム == 上記のような古典的擬似乱数生成法の欠点を克服した、新しい擬似乱数生成法がいくつか考案されている。 メルセンヌ・ツイスタの他、[[キャリー付き乗算]]、[[Xorshift]]、[[Lagged Fibonacci 法]]、[[Permuted congruential generator]] など。 === メルセンヌ・ツイスタ === {{Main|メルセンヌ・ツイスタ}} == その他の生成法 == === カオス乱数 === 非線形微分方程式の解は[[カオス理論|カオス]]で、即ち初期値敏感性等の性質を持つ。これを漸化式として、カオス的な関数を得る。よく使われる関数に[[ロジスティック写像]]や[[テント写像]]がある。[[ロジスティック写像#擬似乱数生成器]]を参照。 == 暗号論的擬似乱数 == {{Main|暗号論的擬似乱数生成器}} 一般の擬似乱数は、その方式と過去の出力が既知であれば、未来の出力を予測可能であるため、暗号の用途には不適('''暗号学的に安全ではない'''と言う)である。 [[暗号理論]]では擬似乱数(生成器)に明確な定義がある。すなわち、多項式時間の計算機が乱数列と[[識別不能]]な列を出力する機器のことを、暗号論的擬似乱数生成器と呼び、この列に含まれる数を暗号論的擬似乱数という。いかなる数列であれば乱数列であるか、議論のあるところではあるが、一様分布であることと過去の数から次の数が予測不能であることは同値であることが示されている(Yao)。そこで過去の数から次の数が予測不能であるかで、暗号論的擬似乱数か否かを区別する。 暗号理論では擬似乱数に厳密な定義が与えられている。Σ = {0,1}とする。自然数 ''k'' に対し、Σ<sup>''k''</sup> 上の一様分布を ''U''<sub>''k''</sub> と表す。確率変数の族 {''X''<sub>''k''</sub>}<sub>''k''∈'''N'''</sub> が、一様分布の族 {''U''<sub>''k''</sub>}<sub>''k''∈'''N'''</sub> と[[計算量的識別不能]]な時、族 {''X''<sub>''k''</sub>}<sub>''k''∈'''N'''</sub> は'''暗号論的擬似乱数'''であるという。 次に暗号論的擬似乱数生成器の厳密な定義をする。''l''(''k'') を ''l''(''k'') > ''k'' を満たす多項式とする。''G'' を[[多項式時間]]アルゴリズムで、''G'' に ''k'' ビットのビット列を入力をすると ''l''(''k'') ビットの出力を返すものとする。すると ''G''(''U''<sub>''k''</sub>) は Σ<sup>''l''(''k'')</sup> 上の確率分布である。確率分布の族 {''G''(''U''<sub>''k''</sub>)}<sub>''k''∈'''N'''</sub> が暗号論的擬似乱数である時、[[多項式時間]]アルゴリズム ''G'' を'''暗号論的擬似乱数生成器'''という。 [[一方向性関数]]が存在すれば暗号論的擬似乱数生成器が存在する事が知られている。 実際の生成法としては、一般の擬似乱数列を[[暗号学的ハッシュ関数]]に通す、という、簡単な構成法がある。 == 脚注 == {{脚注ヘルプ}} === 注釈 === {{Notelist}} {{DEFAULTSORT:きしらんすう}} [[Category:乱数]] [[Category:数学に関する記事]]
このページで使用されているテンプレート:
テンプレート:En
(
ソースを閲覧
)
テンプレート:Lang
(
ソースを閲覧
)
テンプレート:Main
(
ソースを閲覧
)
テンプレート:Notelist
(
ソースを閲覧
)
テンプレート:仮リンク
(
ソースを閲覧
)
テンプレート:出典の明記
(
ソースを閲覧
)
テンプレート:脚注ヘルプ
(
ソースを閲覧
)
擬似乱数
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報