(57)【特許請求の範囲】
【請求項１】
正規乱数を高速に生成する正規乱数生成装置において、
一様乱数を生成する手段と、
上記生成された一様乱数をもとに正規乱数を生成する第１の正規乱数生成手段と、
上記生成された正規乱数を格納する第１のプールと、
上記第１のプールに格納された正規乱数をもとに他の正規乱数を生成する第２の正規乱数生成手段と、
上記生成された他の正規乱数を格納する第２のプールと、
上記生成された他の正規乱数から一部を取り出して出力する手段と、
上記出力した正規乱数の数が指定数に到達しないときに、上記第１のプールと上記第２のプールとを切替えて他の正規乱数を生成およびその一部を出力することを繰り返えさせる手段と
を備えたことを特徴とする正規乱数生成装置。
【請求項２】
所定回数だけ上記他の正規乱数の生成を繰り返したときに上記一様乱数を生成してこれをもとに新たな正規乱数を生成して上記第１のプールに格納し、他の正規乱数の生成を再開することを特徴とする請求項１記載の正規乱数生成装置。
【請求項３】
上記一様乱数を生成するときに必要な情報、上記一様乱数をもとに正規乱数を生成するときに必要な情報、上記正規乱数から他の正規乱数を生成するときに必要な情報、上記他の正規乱数の一部を出力するときに必要な情報、上記一様乱数を再生成して新たな正規乱数を生成するときに必要な情報のうちの少なくとも１つ以上を設定したインタフェースを備え、
当該インタフェースに従い、上記正規乱数を生成して出力することを特徴とする請求項１あるいは請求項２記載の正規乱数生成装置。
【請求項４】
一様乱数を生成する手段と、
上記生成された一様乱数をもとに正規乱数を生成する第１の正規乱数生成手段と、
上記生成された正規乱数を第１のプールに格納する手段と、
上記第１のプールに格納された正規乱数をもとに他の正規乱数を生成する第２の正規乱数生成手段と、
上記生成された他の正規乱数を第２のプールに格納する手段と、
上記生成された他の正規乱数から一部を取り出して出力する手段と、
上記出力した正規乱数の数が指定数に到達しないときに、上記第１のプールと上記第２のプールとを切替えて他の正規乱数を生成およびその一部を出力することを繰り返えさせる手段と
して機能させるプログラムを記録したコンピュータ読取可能な記録媒体。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、正規乱数を高速に生成する正規乱数生成装置および記録媒体に関するものである。
【０００２】
【従来の技術】
従来、シミュレーションなどを行うときに必要となる正規分布を持った乱数（正規乱数という）を生成する場合、Ｐｏｌａ法と呼ばれる方法で正規乱数を生成していた。
【０００３】
Ｐｏｌａ法は、基本的に以下の手順で一様乱数を使って正規乱数を生成している。
ステップ１：［−１，１］の区間の一様乱数を生成する。
【０００４】
ステップ２：ｓ←ｘ２＋ｙ２
ステップ３：ｓ≧１なら  ｇｏｔｏ  １．さもなければ  ｇｏｔｏ  ４．
ステップ４：ｒ←｛−２ｌｎ（ｓ）／ｓ｝１／２
ステップ５：ステップ４の結果を要求元に返す。
【０００５】
ステップ６：要求された正規乱数の数分だけ、ステップ１からステップ５を繰り返す。
【０００６】
【発明が解決しようとする課題】
上述したＰｏｌａ法による正規乱数の生成手法では、正規乱数を生成する毎にステップ４で自然対数および平方根などの演算を計算機では近似計算を行う関係で非常に多くの計算時間を必要としてしまい、シミュレーションなどで数百万（１０６）の正規乱数を必要とする場合には非常に多くの時間が必要となってしまう問題があった。
【０００７】
本発明は、これらの問題を解決するため、インタフェースで指定された情報をもとに一様乱数を生成してこれをもとに正規乱数を生成してプールに格納し、当該プールの正規乱数をもとに新たな正規乱数を高速生成して他のプールに格納すると共にその一部を出力し、プールを切替えて所定回数繰り返したときに最初に戻り異なる一様乱数の生成などを繰り返し、インタフェース指定に対応した信頼性の高い正規乱数を自動的に高速生成することを目的としている。
【０００８】
【課題を解決するための手段】
図１を参照して課題を解決するための手段を説明する。
図１において、Ｓ２は、一様乱数を生成して正規乱数を生成し、プール１に入れたりなどする。
【０００９】
Ｓ５、Ｓ６は、プールから取り出した正規乱数から他の正規乱数を生成したりなどする。
Ｓ９は、他の正規乱数を生成した生成回数が所定値（例えば１０００回）を越えたときに、一様乱数から正規乱数を生成してプールに格納したりなどするものである。
【００１０】
次に、動作を説明する。
Ｓ２で一様乱数を生成して生成された一様乱数をもとに正規乱数を生成し、生成された正規乱数をプール１に格納し、Ｓ５でプール１に格納された正規乱数をもとに他の正規乱数を生成し、生成された他の正規乱数をプール２に格納すると共に生成された他の正規乱数から一部を取り出し、出力した正規乱数の数が指定数に到達しないときにプール１とプール２とを切替えて他の正規乱数を生成・格納およびその一部を出力することを繰り返えすようにしている。
【００１１】
この際、Ｓ９で所定回数だけ他の正規乱数の生成を繰り返したときに一様乱数を生成してこれをもとに新たな正規乱数を生成してプールに格納し、他の正規乱数の生成を再開するようにしている。
【００１２】
また、一様乱数を生成するときに必要な情報、一様乱数をもとに正規乱数を生成するときに必要な情報、正規乱数から他の正規乱数を生成するときに必要な情報、他の正規乱数の一部を出力するときに必要な情報、一様乱数を再生成して新たな正規乱数を生成するときに必要な情報のうちの少なくとも１つ以上を設定したインタフェースを設け、インタフェースに従い正規乱数を生成して出力するにしている。
【００１３】
従って、インタフェースで指定された情報をもとに一様乱数を生成してこれをもとに正規乱数を生成してプールに格納し、プールの正規乱数をもとに新たな正規乱数を高速生成して他のプールに格納すると共にその一部を出力し、プールを切替えて所定回数繰り返したときに最初に戻り異なる一様乱数の生成などを繰り返すことにより、インタフェース指定に対応した信頼性の高い正規乱数を自動的に高速生成することが可能となる。
【００１４】
【実施例】
次に、図１から図４を用いて本発明の実施の形態および動作を順次詳細に説明する。
【００１５】
図１は、本発明の動作説明図を示す。
図１において、Ｓ１は、変数ｓｅｅｄがゼロか判別する。ＹＥＳの場合には、変数ｓｅｅｄがゼロであって、最初と判明したので、Ｓ２に進む。ＮＯの場合には、Ｓ３に進む。
【００１６】
Ｓ２は、
・一様乱数を生成して正規乱数を生成する。これは、例えば既述したＰｏｌａ法により初回のみ正規乱数を生成する。具体的には、インタフェース情報で指定された初期値（正の整数）をもとに一様乱数を生成し、次に、この生成した一様乱数をもとに正規乱数を生成する。
【００１７】
・プール１に入れる。これは、生成した正規乱数をプール１に格納する（図３の（ａ）のプール１に格納する）。
・変数ｉｐ＝１とし、正規乱数をプール１に格納したことを記憶しておく。
【００１８】
・変数ｓｅｅｄをゼロに設定する。
Ｓ３は、
・ａ，ｂ，ｃ，ｄ，θを決める。これは、各変数の値を下記のようにして決める。
【００１９】
・ａ，ｂは、ａ∈｛３，５｝，ｂ∈｛７，１１｝から一様に選ぶ。
・ｃ，ｄは、｛０，１、・・・Ｎ−１｝から一様にランダムに選ぶ。
・θは、後述する図３の（ｄ）の斜線の範囲内で一様にランダムに選ぶ。
【００２０】
Ｓ４は、変数ｉｐ＝１か判別する。ＹＥＳの場合には、Ｓ５に進む。ＮＯの場合には、Ｓ６に進む。
Ｓ５は、
・プール１から２Ｎ個の正規乱数で他の正規乱数を生成し、プール２に入れる。これは、図３の（ａ）で後述するように、プール１から取り出した２Ｎ個の正規乱数に、直交行列を演算して他の一様な新たな正規乱数を生成し、プール２に入れる。
【００２１】
・ｉｐ＝２とする。
・そのうち最初の１／ｆ（例えば１／３）を出力バッファに書き出す。
Ｓ６は、
・プール２から２Ｎ個の正規乱数で他の正規乱数を生成し、プール１に入れる。これは、図３の（ａ）で後述するように、プール２から取り出した２Ｎ個の正規乱数に、直交行列を演算して他の一様な新たな正規乱数を生成し、プール１に入れる。
【００２２】
・ｉｐ＝１とする。
・そのうち最初の１／ｆ（例えば１／３）を出力バッファに書き出す。
Ｓ７は、正規乱数の生成回数を＋１する。
【００２３】
Ｓ８は、Ｎ個（ユーザ指定）の正規乱数を出力したかを判別する。ＹＥＳの場合には、終了する。ＮＯの場合には、Ｓ９に進む。
Ｓ９は、正規乱数の生成回数が１０００回か判別する。ＹＥＳの場合には、プール１からプール２、およびプール２からプール１へ正規乱数を取り出して直交変換して新たな一様な正規乱数を生成して格納することを１０００回行い、規則性が生じる危険性が生じたか判別する。ＹＥＳの場合には、Ｓ２に戻り、新たな初期値をもとに一様乱数を生成し、これをもとに新たなパラメタ（ａ，ｂ，ｃ，ｄ，θ等）を用いて正規乱数を生成してプール１に格納し、Ｓ４以降を繰り返し、ユーザ指定の正規乱数の数分だけ出力するまで繰り返す。
【００２４】
以上によって、インタフェース情報で指定された情報をもとに一様乱数を生成し、この一様乱数をもとにインタフェース情報で指定されたパラメータ（ａ，ｂ，ｃ，ｄ，θなど）をもとに正規乱数を生成してプール１に格納し、プール１から取り出した正規乱数をもとにインタフェース情報で指定されたパラメータ（ａ，ｂ，ｃ，ｄ，θなど）をもとに新たな正規乱数を高速生成してプール２に格納することを繰り返し、インタフェース情報で指定された数の正規乱数を出力することにより、インタフェース情報（後述する図４参照）を設定して入力するのみで自動的に指定した数の正規乱数を取得することが可能となる。この際、正規乱数をもとに新たな正規乱数を生成することで、従来のＰｏｌａ法による一様乱数から正規乱数を生成するときの多くの時間の必要となる演算（自然対数、平方根などの近似式を用いたループ演算で通常の演算に比して約３倍以上の時間が必要となる演算）がなくなり、極めて高速に多量の一様な正規乱数を自動生成することが可能となる。
【００２５】
図２は、本発明の説明図を示す。
図２の（ａ）は、正規乱数から新たな正規乱数を求める行列式を示す。これは、公知のＷａｌｌａｃｅ法を変形したものであって、右辺の行列式で表される正規乱数にＡ（直交行列）を演算して、左辺の新たな正規乱数を求める式である。変数ａ，ｂ，ｃ，ｄ，およびＡ（直交変数）の変数θは（ｂ）から（ｅ）に示すように決定する。この行列式を用いることにより、プール１／プール２から取り出した正規乱数をもとに、新たな正規乱数を生成してプール２／プール１に格納することが可能となる。
【００２６】
図２の（ｂ）は、図２の（ａ）の変数ａ，ｂ，ｃ，ｄ，Ｎの大きさなどを示す。ここでは、図示の下記のようである。
・ａ＞ｂ＞１でａ，ｂ，ｃ、ｄは正の整数であり、このとき、ａとＮ、ｂとＮは互いに素である。
【００２７】
図２の（ｃ）は、図２の（ａ）の直交行列の例を示す。ここでは、図示のような直交行列であって、図示の下記のようなθの範囲を持つ。
・π／６≦θ≦π／３  ｏｒ  ２π／３≦θ≦５π／６であって、
ｍｉｎ（｜ｓｉｎθ｜、｜ｃｏｓθ｜）≧１／２となり、
ｔ＝ｔａｎ（θ／２）を適当な区間の一様乱数から生成して、ｃｏｓθ、ｓｉｎθを計算する。
【００２８】
図２の（ｄ）は、生成された正規乱数のうち１／ｆ（ｆ≧３）をユーザに返却して、次のスプールに使う様子を示す。
図２の（ｅ）は、ａ，ｂ，ｃ，ｄの選び方を示す。ここでは、例えば
・ａ，ｂは各プールに対してａ∈｛３，５｝，ｂ∈｛７，１１｝から、
・ｃ，ｄは｛０，１・・・（Ｎ−１）｝から一様にランダム
にそれぞれ選ぶ。
【００２９】
図２の（ｆ）は、長い正規乱数の生成の仕方を示す。ここでは、１０００Ｎ個（１０００組）の正規乱数を生成した後、よい一様乱数で新しく正規乱数を生成することで更に、長い正規乱数の生成を可能にしている。
【００３０】
図３は、本発明の説明図を示す。
図３の（ａ）は、プール例を示す。これは、既述した図１のＳ２、Ｓ５、Ｓ６で生成した正規乱数を格納するメモリである。図１のＳ５、Ｓ６では、プール１／プール２から取り出した正規乱数をもとに、図２の（ａ）の行列式に従い新たな正規乱数を生成してプール２／プール１に格納することを、切替える態様で繰り返すためのものである。
【００３１】
図３の（ｂ）は、正規乱数をイメージ的に示す。ここで、横軸は正規乱数の値を表し、縦軸はそのときの正規乱数の頻度（個数）を表す。正規乱数は、図示のように、正規分布をしており、全ての正規乱数の平均値を中心に、所定の分散値を持つものである。
【００３２】
図３の（ｃ）は、出力例を示す。生成されたプール１，２に格納された正規乱数の一部（既述した１／ｆで決る一部、例えば先頭から１／３の斜線の部分）を取り出して出力バッファに順次格納し、出力バッファに指定された数の正規乱数が格納されたときに、まとめて要求元に返却する。
【００３３】
図３の（ｄ）は、θの範囲を示す。既述した直交行列に使用するθの範囲は、計算誤差を小さくするために、図示の斜線の範囲内で、一様な乱数で決定する（既述した図２の（ｃ）参照）。
【００３４】
図４は、本発明のインタフェース例を示す。これは、既述した図１のフローチャートに従い正規乱数を生成するときの各種パラメータ（既述したａ，ｂ，ｃ，ｄ，θ、正規乱数の出力数など）を指定するインタフェースであって、図示の下記のインタフェースに必要な情報を設定して図１の処理を実行する関数（ルーチン）に渡す（呼び出して渡す）のみで自動的に指定した条件のもとで生成した正規乱数を受取ることが可能となる。
【００３５】
ＣＡＬＬ  ＤＶＲＡＮＡ（ＤＡＭ，ＤＳＤ，ＩＸ，ＤＡ，Ｎ，ＤＷＯＲＫ，ＮＷＯＲＫ，ＩＣＯＮ）
ＤＡＭ（入力）：正規分布の平均ｍ
ＤＳＤ（入力）：正規分布の標準偏差
ＩＸ（入力）：入力出発値（Ｓｅｅｄ），初回は正の整数、２回目以降はゼロが返却される。
【００３６】
ＤＡ（出力）：Ｎ個の正規乱数
Ｎ（入力）：ＤＡに返却される正規乱数の個数
ＤＷＯＲＫ（作業域）：大きさＮＷＯＲＫの１次元配列
ＮＷＯＲＫ（入力）：配列ＤＷＯＲＫの大きさ
ＩＣＯＮ（出力）：コンディションコード
【００３７】
【発明の効果】
以上説明したように、本発明によれば、インタフェースで指定された情報をもとに一様乱数を生成してこれをもとに正規乱数を生成してプールに格納し、プールの正規乱数をもとに新たな正規乱数を高速生成して他のプールに格納すると共にその一部を出力し、プールを切替えて所定回数繰り返したときに最初に戻り異なる一様乱数の生成などを繰り返す構成を採用しているため、インタフェース指定に対応した信頼性の高い正規乱数を自動的に高速生成できる。例えば従来技術の欄で説明したＰｏｌａ法のときに正規乱数を生成する毎に自然対数や平方根などの非常に時間のかかる場合に比して、本願発明では自然対数や平方根などのような近似式を用いて演算に長時間かかる演算を無くして正規乱数の生成を高速化できると共に、更に、行列式を用いて正規乱数から新たな正規乱数を生成することでベクトル計算機を使用して高速に多量の正規乱数を生成することが可能となる。これらにより、多量の正規乱数を用いて行うシュミレーションなどの高速化を図ることが可能となる。
【図面の簡単な説明】
【図１】本発明の動作説明図である。
【図２】本発明の説明図（その１）である。
【図３】本発明の説明図（その２）である。
【図４】本発明のインタフェース例である。
【符号の説明】
Ｓ２：一様乱数生成
Ｓ３：パラメータの生成
Ｓ５、Ｓ６：正規乱数から新たな正規乱数の生成
Ｓ９：新たな一様乱数／正規乱数の生成
【図１】
0003580737.tif 000002
【図２】
0003580737.tif 000003
【図３】
0003580737.tif 000004
【図４】
0003580737.tif 000005