0

我正在为 MT19937 使用 A C 程序,初始化改进了 2002/1/26。由 Takuji Nishimura 和 Makoto Matsumoto 编码。在复制源文件并运行随机函数后取自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);

我的一个朋友对类似代码进行了大约一百万次模拟(不是开玩笑),并且在最小/最大范围内得到了很好的数字分布。

编辑:不确定你使用的是什么版本,但我的实现有这个重载的构造函数:

/// <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 回答