恩師,三橋教授のご厚意により博士課程修了後も維持されてきた当サイトでありますが, この度,三橋教授のご退官により, 時期は未定でありますが来年度中に閉鎖される見通しとなりました. したがいまして,このページの情報を必要とされる方は各自それぞれで必要なページの保存等を行うことをお奨めいたします. 圧縮ファイル形式での提供を希望される方は著者までメールでご連絡下さい. 可能な限り対応させていただきます.
なお,ダウンロードツール類を使用してのバックアップ取得は堅くお断りいたします. この種のツールを利用した場合,ネットワークブロックに対するアクセス規制が行われる恐れがあります.
Windows版のサンプルコードを更新しました.
Visual C++を利用する場合のライブラリの構築方法の記述を追加しました.
サンプルコードを更新.
randlib.hの呼び出しの誤りを修正しましたサンプルコードを更新.
ranlib.hはrandlib.hに変更されましたサンプルコードを更新.
サンプルコードを更新.
Makefileを修正しましたRANDLIBはTexas大学,M. D. Anderson 癌センターのBarry W. Brown,James Lovato両氏によって実装されたC言語による擬似乱数発生ライブラリです. ここでの擬似乱数とはある値の次の値が完全に決定論的な数列を指すこととします, また,擬似乱数は疑似乱数と書くこともあるようですが,ここでは擬似乱数で統一します. C言語からこのRANDLIBを利用することで,一様乱数や正規乱数を簡単に得ることができます. RANDLIBを用いることで以下の分布に従う乱数が生成できます.
工学的な応用で多用されるガウス雑音は一様分布を何らかの手段で正規分布に変換して発生させます.
例えば,乱数間に相関のある多次元正規分布を得るには,
Box-Muller法などを用いて得た複数の標準正規乱数を共分散行列のCholesky分解で変換する必要がありますが,
RANDLIBを用いることでこうした手間を省くことができます.
また,RANDLIBはFortran版がoctaveの乱数生成ルーチン
であるrand()やrandn()に,
C言語版の一部がPHPの統計関数群に使用されています.
RANDLIBは三橋研のFreeBSDの標準インストールパッケージには含まれていませんが, RANDLIBはC言語の標準ライブラリのみに依存するため,配布ファイル単独でコンパイルできます. 最新のサンプルコードはライブラリの構築を自動化してあるため, 利用中の計算機にRANDLIBがインストールされていなくとも問題ありません.
参考文献をあげておきます.ドキュメントによれば,RANDLIBは [1]に基づく実装です, また基礎理論を知るためには [2]は非常に良い文献です.
ACM TransactionsはACM transactions on Mathematical Software から検索できます.2005年9月現在,webからFull-text(pdf)が利用できます. この文献で提案される乱数源の周期はおよそ,23*1018であるとのことです.
ソースコードの入手からライブラリの構築までを解説します.
最新版のサンプルコードはライブラリの構築を自動化してあります. したがって,本節は何らかの理由でライブラリを手動で構築する際の参考にしてください.
まず,公式サイトから,
ソースコードRANDLIB_V90.tar.gz)をダウンロードしてください.
ダウンロードしたソースコードはディレクトリrandlibcに展開してあるとします.
% cd randlibc % gcc -O2 -c ./source/randlib.c/src/linpack.c % gcc -O2 -c ./source/randlib.c/src/com.c % gcc -O2 -c ./source/randlib.c/src/randlib.c % ar cr librandlibc.a linpack.o com.o randlib.o % ranlib librandlibc.a
この作業でrandlibcディレクトリにライブラリlibrandlibc.aが作成されます.
arコマンドによりアーカイブが作成され,ranlibコマンドによりアーカイブ内のファイルや関数の一覧表をアーカイブに埋め込みます.
それぞれのコマンドの詳細はar,ranlibのマニュアルページを参照して下さい.
RANDLIBの利用に必要なのはlibrandlibc.aと配布ファイル中の
./source/randlib.c/src/にあるrandlib.hです.
RANDLIBは一様乱数をもとにして種々の分布に従う乱数系列を生成します.
RANDLIBでユーザーから利用可能な関数を以下の表にまとめます.
ここで,日本語の解説のない関数を利用する場合は,
RANDLIBの配布ファイル中の./source/randlib.c/doc/
の英語ドキュメントを参照してください.
| 関数名 | 内容 |
|---|---|
advnst | 乱数源の状態を2kだけ進めます |
genbet | ベータ分布にしたがう乱数を発生させます |
genchi | カイ二乗分布にしたがう乱数を発生させます |
genexp | 指数分布にしたがう乱数を発生させます |
genf | F分布にしたがう乱数を発生させます |
gengam | ガンマ分布にしたがう乱数を発生させます |
genmn | 多次元正規分布に従う乱数を発生させます |
genmul | GENerate MULtinomial random deviate |
gennch | Generate random value of Noncentral CHIsquare variable |
gennf | GENerate random deviate from the Noncentral F distribution |
gennor | 一次元正規分布に従う乱数を発生させます |
genprm | 任意の長さの整数配列をランダム置換します |
genunf | 任意の実数区間の一様乱数を発生させます |
getsd | GET SeeD |
gscgn | Get/Set GeNerator |
ignbin | GENerate BINomial random deviate |
ignnbn | GENerate Negative BiNomial random deviate |
ignlgi | GeNerate LarGe Integer |
ignpoi | ポアソン分布にしたがう乱数を発生させます |
ignuin | 任意の整数区間の一様乱数を発生させます |
initgn | INIT-ialize current G-e-N-erator |
mltmod | Returns (A*S) MOD M |
phrtsd | 任意のフレーズから乱数源の初期化のための整数の組を生成します |
ranf | RANDom number generator as a Function |
setall | 全ての乱数源を初期化します |
setant | SET ANTithetic |
setgmn | 多次元正規分布のパラメターを設定します |
setsd | SET S-ee-D of current generator |
sexpo | Sranderd EXPOnantial distribution |
sgamma | Sranderd GAMMA distribution |
snorm | Sranderd NORmal distribution |
乱数源の状態を2kだけ進めます.
void advnst(long k);
状態がkではなく2kだけ進められる事に注意してください.
次の確率密度関数を有する(第1種)ベータ分布に従う乱数を発生させます.
ただし,B はベータ関数です.引数で指定可能なパラメターは a と b です.
float genbet(float aa, float bb);
指定したパラメターのベータ分布に従う乱数が返されます.
次の確率密度関数を有するカイ二乗分布に従う乱数を発生させます.
ただし,G はガンマ関数です.引数で指定可能なパラメターは k です.
float genchi(float df);
指定した自由度のカイ二乗分布に従う乱数が返されます.
次の確率密度関数を有する指数分布に従う乱数を発生させます.
引数で指定可能なパラメターは期待値
です.
float genexp(float av);
を指定します.lambda でななく,その逆数である期待値を指定することに注意してください.
指定した期待値の指数分布に従う乱数が返されます.
次の確率密度関数を有するF分布にしたがう乱数を発生させます.
F分布は二つのカイ二乗分布にしたがう乱数の比で定義されます.
引数で指定可能なパラメターはこのカイ二乗分布の自由度です.
float genf(float dfn, float dfd);
指定したパラメターのF分布に従う乱数が返されます.
次の確率密度関数を有するガンマ分布に従う乱数を発生させます.
ただし,G はガンマ関数です.引数で指定可能なパラメターはスケールパラメターの逆数
と形状パラメターです.
float gengam(float a,float r);
を指定します.指定したパラメターのガンマ分布に従う乱数が返されます.
多次元正規分布に従う乱数を発生させます.
void genmn(float *parm,float *x,float *work);
多次元正規分布のパラメターは関数setgmnで設定します.
一次元正規分布に従う乱数を発生させます.
float gennor(float av,float sd);
指定した平均と標準偏差の正規分布に従う乱数が返されます.
任意の長さの整数配列をランダム置換します.
void genprm(long *iarray,int larray);
任意の実数区間[low, high]の一様乱数を発生させます.
float genunf(float low,float high);
指定した上限と下限の間の一様分布に従う乱数が返されます.
上限値は下限値よりも大きくなければなりません.
次の確率密度関数を有するポアソン分布に従う乱数を発生させます.
引数で指定可能なパラメターはポアソン分布の平均値 mu です,
long ignpoi(float mu);
指定した平均値のポアソン分布に従う乱数が返されます.
任意の整数区間[low, high]の一様乱数を発生させます.
long ignuin(long low,long high);
指定した上限と下限の間の一様分布に従う乱数が返されます.
上限値は下限値よりも大きくなければなりません.
ヌル文字で終わる任意のフレーズから乱数源の初期化のための整数の組を生成します.
void phrtsd(char* phrase, long* seed1, long* seed2);
関数genmnで利用する多次元正規分布のパラメターを設定します.
void setgmn(float *meanv, float *covm, long p, float *parm);
共分散行列は正定値対称行列を列優先で与える必要があります.
また,正常終了時に*covmの領域の内容が破壊される事に注意してください.
全ての乱数源を初期化します.
void setall(long iseed1,long iseed2);
初期化のための整数は互いに異なるものとし,
また,その値は230を越えない正の数とします.
良く分からない場合は関数phrtsdにランダムな文字列を与えて作った数値を利用してください.
サンプルコードとしてsample_randlib.tbzを置いておきます.
適当なところで展開するとMakefileと以下のソースコードが展開されます.
gauss2d.cpermutation.ctest_randlib.cinit_randlib.crandlib_config.hgauss2d.cは二次元正規乱数の発生の,permutation.cは整数配列のランダム置換の,test_randlib.cは一様分布,正規分布,指数分布に従う乱数の生成のサンプルコードです.init_randlib.cは乱数源の初期化の手続きをまとめたものです.
randlib_config.h内のDEV_RANDOM_INITマクロを設定することで,
/dev/urandomデバイスから取得した値で乱数源を初期化できます.
/dev/urandomが存在しない場合はTIME_INIT
マクロを設定することで乱数源を現在時刻から生成した数値列で初期化するように設定できますが,
初期化のためのフレーズが数字に偏ることによる問題が発生する恐れがあります.
初期設定では,これらのオプションは設定されておらず,
何らかのフレーズの入力によって乱数源を初期化します.
また,初期化の手続きはあくまで実装例である事に注意してください.
必要があれば利用者側で調整した方が良いと思われます.
まず,Visual C++を用意してください.
2010年現在無償で入手できる
Visual C++2008 Express Editionでもかまいません.
続いて,sample_randlib_win32.zipを適当な場所で展開すると,
sample_randlib_win32フォルダが作られますから,
ここに公式サイト
からダウンロードできるソースコード(RANDLIB_V90.tar.gz)を展開してください.
後はVCProjフォルダ内のソリューションをビルドしてください.
サンプルコードの実行ファイルと以下のライブラリが構築されます.
利用するランタイムは上からそれぞれ/MT,/MTd,/MD,/MDd,
呼び出し規約は全て__cdeclです.
なお, Windows では乱数源の初期化にCryptGenRandom関数を利用します.
randlib.librandlib_d.librandlib_md.dllrandlib_md_d.dll
RANDLIBの利用に必要なのはこれらのライブラリと配布ファイル中の
./source/randlib.c/src/にあるrandlib.hです.
サンプルコードは既定ではダイナミックリンクライブラリを利用するように設定してあります.
スタティックリンクライブラリを利用する場合はプロジェクトの依存関係とコンパイラのコード生成オプションを適切に設定してください.
本マニュアルは不完全です,改訂を歓迎します.