しかし、乱数を得る組み込み関数のアルゴリズムとして多くのシステムで合同法が採用されている中で、.Net Frameworkの場合は減算法を用いています。実のところ、System.Randomクラスの内部的な31bit整数の乱数生成の実装も、NUMERICAL RECIPESの移植であることはほぼ間違いありません。
Microsoft社のシェアードソースCLIをダウンロード(1.0はこちら、2.0はこちら)することによりソースコードを入手でき、内容を詳細に検討できますが、System.Randomクラスでは、Double型浮動小数点数で乱数を得るNextDouble関数(内部的にはSample関数)も、Double型の52bitの仮数部のうち高々31bitしか用いていません。Sample関数をオーバーライドする派生クラスを作った場合、その影響を受ける関数が.Net Frameworkのバージョン間で違います。さらに、8bit整数の乱数列を得るNextBytesメソッドでは、.Net Frameworkの1.0では31bitの整数の上位bitを、2.0では下位bitを用いる(一般的に擬似乱数の下位bitを使用することは統計的に推奨されません。)など、.Net Frameworkのバージョン間で一貫性がありません。
このようなSystem.Randomクラスのバージョン間差異や統計的な根拠の不明点(こちらにメモがあります。)を解消するため、ここでは、System.Randomクラスと同等の関数やメソッドを備え、かつ、一貫性、整合性がより高い実装を行うこととしました。
31bitの基本となる整数の乱数を得るNextRaw関数、これに基づいて、仮数部の上位31bitのみを用いてDouble型浮動小数点数の乱数を得るNextDoubleRaw関数、さらに、8bit整数の乱数列をByte型配列に格納するNextBytesRawメソッドを備えています。これらの名前にはすべて「Raw」の文字が入っていますが、次に述べるSample関数より上流側に位置して、Sample関数の影響を受けない「生」の乱数を提供することを意味します。
NextRaw関数を2回呼び出して31bit整数の乱数を2つ得て、それぞれの上位26bitを取り出し、Double型浮動小数点数の仮数部52bitに格納し、[0,1)の範囲の浮動小数点数を得るSample関数を備えています。これは、Protected Overridableな関数で、派生クラスでOverrideすることができます。[0,1)の範囲は守りつつ分布の異なる乱数を生成すれば、次に述べる関数やメソッドで得られる乱数の分布も連動して変更されます。
Sample関数が返す結果に基づき、Double型浮動小数点数の乱数を得るNextDouble関数、Integer型整数の乱数を得るNext関数(範囲を指定できるオーバーロードあり)、さらに、8bit整数の乱数列をByte型配列に格納するNextBytesメソッドがあります。