擬似乱数の生成アルゴリズムにはいくつか種類がありますが、Randomクラスを継承して独自に疑似乱数を実装することもできます。 Randomクラスを継承して疑似乱数生成アルゴリズムを実装する際に最低限必要となるのは、Sampleメソッドをオーバーライドし、0.0以上1.0未満の乱数を返すように実装することです。
以下の例では、線形合同法を実装したLCGRandomクラスを作成し、Randomクラスが生成する乱数との比較を行っています。 なお、この実装は一つの例として挙げたもので、生成される乱数の周期や分散については考慮していません。 実際に使用する場合は注意してください。
以下のコードでは、Sampleメソッドでオーバーフローが発生するため、/removeintchecks+
オプションを有効にしてコンパイルするか、プロジェクトファイルにてRemoveIntegerChecks
をTrue
にしてコンパイルしないと例外OverflowExceptionがスローされます。
この例ではオーバーフロー時に例外のスローを抑止する目的でunchecked
ステートメント、および/removeintchecks+
コンパイルオプションを使用しています。 詳しくは整数型のオーバーフローとチェックを参照してください。
このように、Sampleメソッドをオーバーライドすることで独自の乱数生成を行うことができます。 場合によっては、Sampleメソッドを適切に実装することでメソッドの戻り値の範囲が閉区間となるようにすることもできます。
なお、Randomクラスを継承する場合、引数をとらないNextメソッドなどSample以外のメソッドもオーバーライドしないと動作が変わらないメソッドがあります。 詳しくはSampleメソッドのリファレンスを参照してください。