当我编译一个相当标准的随机数生成器mt19937ar.c时,我总是会遇到一些问题,需要从中获取一些代码。
在函数“init_genrand”中:
警告:从“int”转换为“long unsigned int”可能会更改结果的符号

/* Period parameters */
#define N 624
#define M 397
#define MATRIX_A 0x9908b0dfUL   /* constant vector a */
#define UPPER_MASK 0x80000000UL /* most significant w-r bits */
#define LOWER_MASK 0x7fffffffUL /* least significant r bits */

static unsigned long mt[N]; /* the array for the state vector  */
static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */

/* initializes mt[N] with a seed */
void init_genrand(unsigned long s)
{
    mt[0]= s & 0xffffffffUL;
    for (mti=1; mti<N; mti++) {
        mt[mti] =
            (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
        /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
        /* In the previous versions, MSBs of the seed affect   */
        /* only MSBs of the array mt[].                        */
        /* 2002/01/09 modified by Makoto Matsumoto             */
        mt[mti] &= 0xffffffffUL;
        /* for >32 bit machines */
    }
}

具体来说,错误在于
mt[mti] =
            (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);

我试着通过
mt[mti] = (long unsigned int)
            (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);

这真的没有意义,但我只是在尝试这段代码是1997年的-估计现在有人会发现并修复它我该怎么解决或者让我的编译器停止哭泣?

最佳答案

您需要将mti的类型更改为unsigned intunsigned long int

static unsigned int mti = N+1;

因为在给定的表达式中mti将被提升为unsigned long

07-24 09:45
查看更多