Mersenne Twister随机算法我怎么能在init_genrand中播种,随机数总是一样的C#

Mersenne Twister随机算法我怎么能在init_genrand中播种,随机数总是一样的C#,c#,random,random-sample,mersenne-twister,C#,Random,Random Sample,Mersenne Twister,我正在为MT19937使用一个C程序,初始化改进为2002/1/26。代码由Takuji Nishimura和Makoto Matsumoto编写。取自 当复制源文件并运行随机函数后,我总是得到相同的数字。 在文件中提到的说明 使用前,使用init_genrand(seed)初始化状态 或按数组初始化(初始化密钥,密钥长度) 我怎样才能点燃种子 构造函数以这种方式初始化它,这导致随机数始终相同: ulong [] init = new ulong[4];

我正在为MT19937使用一个C程序,初始化改进为2002/1/26。代码由Takuji Nishimura和Makoto Matsumoto编写。取自 当复制源文件并运行随机函数后,我总是得到相同的数字。 在文件中提到的说明

使用前,使用init_genrand(seed)初始化状态
或按数组初始化(初始化密钥,密钥长度)

我怎样才能点燃种子

构造函数以这种方式初始化它,这导致随机数始终相同:

            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);

这似乎对我有用:

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;
    }
}
//
///初始化类的新实例。
/// 
///非零种子。
公共梅森网络(uint种子)
{
/*使用[KNUTH 1981,《计算机编程艺术》第2卷(第2版),第102页]中表1的第25行发生器将初始种子设置为mt[N]*/
mt[0]=种子&0xffffffffU;
对于(mti=1;mti
这似乎对我有用:

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;
    }
}
//
///初始化类的新实例。
/// 
///非零种子。
公共梅森网络(uint种子)
{
/*使用[KNUTH 1981,《计算机编程艺术》第2卷(第2版),第102页]中表1的第25行发生器将初始种子设置为mt[N]*/
mt[0]=种子&0xffffffffU;
对于(mti=1;mti
要为随机生成器设定种子,每次执行都需要一个不同的数字。通常使用基于系统时钟的数字,例如:

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


要为随机生成器设定种子,您需要一个每次执行都不同的数字。通常使用基于系统时钟的数字,例如:

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


使用每次启动程序时都会更改的值(如当前时间)初始化它。使用每次启动程序时都会更改的值(如当前时间)初始化它。它非常慢,因为
RNGCryptoServiceProvider
的每次调用开销很大。当我使用
RNGCryptoServiceProvider
时,我一次请求4KB左右,然后自己管理该缓冲区。我需要的是从一组数字中随机索引一次,所以速度不是问题。很好,抱歉,但我想使用MersenneTwister,因为
RNGCryptoServiceProvider
的每次调用开销很大,所以那里没有获取参数的构造函数,速度非常慢。当我使用
RNGCryptoServiceProvider
时,我一次请求4KB左右,然后自己管理该缓冲区。我需要的是从一组数字中随机索引一次,所以速度不是问题。很好,但很抱歉,我想使用MersenneTwister,但那里没有获取参数的构造函数函数init_genrand没有获取任何值作为参数,我需要使用init_by_数组函数初始化it@LiadLivnat:好的,看起来就像你描述的那样。我使用上面的数组添加了一个版本。函数init_genrand没有得到任何值作为参数,我需要使用init_by_数组函数初始化it@LiadLivnat:好的,看起来就像你描述的那样。我使用上面的数组添加了一个版本。