randmulcon.NET.zip (VB.NET)
Ran0、Ran1、及びRan2と3種類のクラスがありますが、いずれも
NUMERICAL RECIPES in C (日本語版)
William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery
技術評論社
ISBN4-87408-560-1
に掲載されている関数を移植したもので、31bit整数の乱数を内部的に生成し、これを基に0~1のDouble型の一様乱数を生成するメソッドを備えています。(Double型で乱数が取り出されますが、内部的には高々31bitの精度しかありません。)
-
Ran0は、ParkとMillerが、乗算合同法でも線形合同法と同程度にランダムな乱数列を生成できることを示した例です。Schrageの技法により符号付き32bit整数型(VB.NetではInteger型、前のバージョンではLong型)でもオーバーフローしないように計算方法が工夫されています。正確な生成範囲は(0,1]で、周期は約2×109です。
-
Ran1は、Ran0を改良し、予めある程度の乱数列を発生させて配列に格納しておき、引き続いて生成される乱数に基づいて配列の要素を選び出力し、要素そのものは置き換えていく方法で、格段にランダムさが向上しています。数千万個の乱数列でよければRan1が最も速度と統計的な性能のバランスに優れてるようです。生成範囲は(0,1)で、周期はRan0とほぼ同じです。
-
Ran2は、Ran0と同等の微妙に周期が異なる2つの乱数列を組み合わせ、各々の周期のほぼ2乗の周期を実現しています。合同法に基づく乱数生成法としては、最も優れているアルゴリズムのようで、実用上の要求をほぼ満足します。生成範囲は(0,1)で、周期は約2.3×1018です。