これまでのところ、ここにある C# Mersenne Twisterを使用して乱数を生成してきました。
http://www.centerspace.net/resources.php
ここで2倍高速であるはずのSFMTを発見しました:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/
SFMT の C# 実装を教えてもらえますか?
私の要件は、0 と 2^20 (1048576) の間 (および含む) の整数を生成することです。
24 時間時計で実行されるシミュレーションでは、これを毎日何兆回も行う必要があるため、これを完全に微調整するのに何日も費やす準備ができています。
現在、私の要件に合わせて新しいメソッドを追加することで、センター スペース メルセンヌ ツイスターを微調整しました。
public uint Next20()
{
return (uint)(genrand_int32() >> 12);
}
メソッドを使用して、上記のキャストとシフトを節約するために 0 と 2^20 の間 (および 0 を含む) の整数を生成するgenrand_int32()
独自のバージョン を生成したいのですが、数学がわかりません。正確にどうすればこれを行うことができますか?genrand_int20()
また、uint を使用すると int よりも高速になりますか、それとも単にアドレス指定可能な数値の問題ですか? 1048576 までしか必要ないので、速度だけに関心があります。
また、これは.NET 2 を搭載した Windows Server 2003 R2 SP2 (32 ビット) ボックスで実行されます。プロセッサはAMD Opteron 275 (4 コア)です。