math.mt-random
- Mersenne Twister乱数発生器 ¶Makoto MatsumotoとTakuji Nishimuraにより開発された、 “Mersenne Twister”アルゴリズムに基づく、 仮想的な乱数発生器(RNG)を提供します。 高速で、2^19937-1という極めて長大な周期を持ちます。 アルゴリズムの詳細については、https://dl.acm.org/citation.cfm?id=272995を参照して下さい。
乱数発生器の通常の用途には、srfi.27
を使うことをお勧めします
(srfi.27
- ランダムビットのソース参照)。
srfi.27
はこのモジュールの上に実装されていますが、ポータブルなAPIを提供しています。
srfi.27
にない機能が必要な時のみこのモジュールを直接使うようにしてください。
{math.mt-random
}
Mersenne Twister RNGの状態をカプセル化するクラスです。
このクラスのそれぞれのインスタンスは独自の状態を持ち、
個別のシードで初期化されていれば、それぞれがランダムビットの
独立したソースになり得ます。
{math.mt-random
}
新たな<mersenne-twister>
のインスタンスを作って返します。
seed引数が与えられたなら、それは任意の正確な非負整数か、
u32vctor
でなければなりません。キーの長さに制限はありません。
seedが省略されるか#f
の場合、RNGは固定の種で初期化されるので、
そのままだと常に同じ乱数列を生成します。
インスタンス毎に異なる乱数列が必要なら、明示的に異なる種を渡すか、
下のmt-random-set-seed!
で種を設定してください。
デフォルトでは、作られるRNGはスレッドセーフです。 すなわち、複数のスレッドからジェネレータを呼んでも内部状態を壊してしまうことはありません。
ただ、RNGを一つのスレッドからしか使わないとか、他のロックで常に排他された環境でしか 呼ばないということがわかっているなら、private?引数に真の値を渡すことができます。 その場合、RNGはロックを省略します。
(define m (make-mersenne-twister (sys-time))) (mt-random-real m) ⇒ 0.10284287848537865 (mt-random-real m) ⇒ 0.463227748348805 (mt-random-real m) ⇒ 0.8628500643709712 ...
{math.mt-random
}
メルセンヌツイスターRNG mtにランダムシードの値seedをセットします。
seedは任意の正の正確整数か、任意長のu32vector
(srfi.4
- 単一型のベクタ参照)が使えます。
MTRNGは32ビット整数624個の配列を内部状態として持っています。 シード値が小さい場合(例: fixnum)、充分なバリエーションを作ることができません。 特に、シード値が32ビットに収まる場合、MTRNGの二つの出力だけから シード値が逆算できてしまいます。 もし乱数列をもっと予測しづらくしたいなら、u32vectorをエントロピーの高いビットで満たして それをシードとして使ってください。
メルセンヌツイスターは暗号学的に安全であることを意図して作られてはいません。 セキュリティが重要な用途には使わないでください。
註: 0.9.9までは、seedにbignumが渡された場合、そこから独自のアルゴリズムで 32bitの値を生成してメルセンヌツイスタの初期化関数を呼んでいました。 しかしそれだとエントロピーを捨てることになるので、現在は 全てのビットがシード値に使われるように変更されています。
{math.mt-random
}
Mersenne Twister RNG mtを初期化するのに使われたシード値を返します。
複数回初期化されている場合は、最後に初期化されたものを返します。
シード値は正確な整数かu32vectorです。
初期化されたことがなければ、#<undef>
が返されます。
{math.mt-random
}
Mersenne Twister RNG mtを取り出して再インストールします。
状態は、625要素のu32vectorで表現されます。
状態はどこにでも保存することができ、仮想的なランダムシーケンスの
生成を続行するために、<mersenne-twister>
のインスタンスとして
リストアできます。
{math.mt-random
}
0.0と1.0の間のランダムな実数を返します。
1.0は範囲に含まれません。
mt-random-real
は、0.0も範囲に含みませんが、
mt-random-real0
は含みます。
0.0を含まないのは、SRFI-27ドラフトに依拠しています。
{math.mt-random
}
0からrange-1までの正の正確整数をランダムに返します。
rangeはいかなる正の正確整数でも構いません。
{math.mt-random
}
与えられたユニフォームベクタをランダムな数値で埋めます。
mt-random-fill-u32vector!
では、要素は0と2^32-1の間の
正の正確整数で埋められます。
mt-random-fill-f32vector!
とmt-random-fill-f64vector!
では、0.0と1.0(含まれない)の間の非正確実数で埋められます。