0

私はMT19937のCプログラムを使用しており、初期化は2002/1/26に改善されています。コードは西村拓二と松本眞琴です。 ソースファイルをコピーしてランダム関数を実行した後、 Codeprojectリンクから取得すると、常に同じ番号が取得されます。言及されたファイルの説明で


使用する前に、init_genrand(seed)またはinit_by_array(init_key、key_length)を使用して状態を初期化します。

シードを初期化するにはどうすればよいですか、

コンストラクターはこの方法で初期化しました。これにより、乱数は常に同じになります。

            ulong [] init = new ulong[4];
        init[0]= 0x123;
        init[1]= 0x234;
        init[2]= 0x345;
        init[3] =0x456;
        ulong length = 4;
        init_by_array(init, length);
4

2 に答える 2

2

乱数発生器をシードするには、実行ごとに異なる数が必要です。通常、システム クロックに基づく数値が使用されます。次に例を示します。

init_genrand((ulong)DateTime.UtcNow.Ticks);

また:

ulong[] init = { (ulong)DateTime.UtcNow.Ticks };
ulong length = init.Length;
init_by_array(init, length);
于 2013-01-12T17:50:29.863 に答える
1

これは私にとってはうまくいくようです:

var rng = new RNGCryptoServiceProvider();
var buffer = new byte[4];

rng.GetBytes(buffer);
uint result = BitConverter.ToUInt32(buffer, 0);

var random = MersenneTwister(result).Next(min, max);

私の友人は、同様のコードで約 100 万回 (冗談ではありません) シミュレーションを実行し、最小/最大の範囲で数値の適切な分布を得ました。

編集:使用しているバージョンはわかりませんが、私が持っている実装には、このオーバーロードされたコンストラクターがあります:

/// <summary>
/// Initializes a new instance of the <see cref="MersenneTwister"/> class.
/// </summary>
/// <param name="seed">The NONZERO seed.</param>
public MersenneTwister( uint seed )
{
    /* Setting initial seeds to mt[N] using the generator Line 25 of Table 1 in [KNUTH 1981, The Art of Computer Programming Vol. 2 (2nd Ed.), pp102] */
    mt[0] = seed & 0xffffffffU;
    for ( mti = 1; mti < N; ++mti )
    {
        mt[mti] = ( 69069 * mt[mti - 1] ) & 0xffffffffU;
    }
}
于 2013-01-12T17:49:26.810 に答える