2021/10/10 に大幅な改良をして、かなり高速化しました。
マクロ AVX2 を定義してコンパイルすると、AVX2 を使った高速なプログラムができます。
16ビットコンパイラにも TDM-GCC-64 10.3.0 にも VC++2022 にも対応しています。
浮動小数点数に特化した乱数ライブラリ(SSE2対応)
32ビット整数の生成は他のに比べ少し遅くなりますが、浮動小数点数の生成はかなり高速です。
SFMT:新しいメルセンヌ・ツイスタを使った乱数ライブラリ
これには、C/C++(zsfmt)、C#、Java、Visual Basic が含まれます。
また、プログラムを自動作成するためのC言語ソースや、
それぞれに、結果の確認と実行時間計測するテストプログラムが含まれます。
独立した系列を32個持っています。
XorShiftを使った乱数ライブラリ
これにも、C/C++(zxor)、C#、Java、Visual Basic
が含まれます。
それぞれに、結果の確認と実行時間計測するテストプログラムが含まれます。
関数名などはメルセンヌ・ツイスタと共通にしているため不自然になっています。
SSE2に対応していないCPUやコンパイラではSFMTよりも高速です。
基になったプログラムは以下のようにシンプルです。
http://www.jstatsoft.org/v08/i14/
unsigned long xor128(){ static unsigned long x=123456789,y=362436069,z=521288629,w=88675123; unsigned long t; t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w>>19))^(t^(t>>8)) ); }
参考資料:メルセンヌ・ツイスタ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
参考文献:奥村晴彦 著「C言語による最新アルゴリズム事典」1991 技術評論社
zmtrand、zsfmt、zdsfmt 共通の特徴は以下です。
zsfmt の特徴は以下です。
その他の言語で書かれた Sfmt の特徴は以下です。
Sfmt で指定した MEXP に対する、乱数の周期の長さは以下の整数倍です。
zmtrand の周期は、4.31e6001 になります
MEXP 保障された周期の長さ 607 5.31e182 1279 1.04e385 2281 4.46e686 4253 1.90e1280 11213 2.81e3375 19937 4.31e6001 44497 8.54e13394 86243 5.36e25961 132049 5.12e39750 216091 7.46e65049
主な関数の用途
InitMt(S) 整数の種Sによる初期化 InitMtEx(K,L) 長さLの配列Kによる初期化 NextMt() 32ビット符号なし整数の乱数 NextUnif() 0以上1未満の乱数(53bit精度) NextInt(N) 0以上N未満の整数乱数 NextIntEx(N) 丸め誤差のない0以上N未満の整数乱数 NextBit() 0か1を返す(NextInt(2)の最高10倍高速) NextByte() 0から255の値を返す NextChisq(N) 自由度νのカイ2乗分布 p. 27 NextGamma(A) パラメータAのガンマ分布 p. 31 NextGeometric(P) 確率Pの幾何分布 p. 34 NextTriangle() 三角分布 p. 89 NextExp() 平均1の指数分布 p.106 NextNormal() 標準正規分布(最大8.57σ) p.133 NextUnitVect(V,N) N次元のランダム単位ベクトル p.185 NextBinomial(N,P) パラメータN,Pの2項分布 p.203 NextBinormal(R,&X,&Y) 相関係数Rの2変量正規分布 p.211 NextBeta(A,B) パラメータA,Bのベータ分布 p.257 NextPower(N) パラメータNの累乗分布 p.305 NextLogistic() ロジスティック分布 p.313 NextCauchy() コーシー分布 p.331 NextFDist(A,B) 自由度A,BのF分布 p.344 NextPoisson(L) 平均λのポアソン分布 p.412 NextTDist(N) 自由度Nのt分布 p.430 NextWeibull(A) パラメータαのワイブル分布 p.431
ほかの関数や、より詳細な使い方は、それぞれの言語のテストプログラムを読んでください。
一部の関数ではパラメータの受け取り方が言語により異なります。