关于洛谷随机数日报
  • 板块灌水区
  • 楼主DPair
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/11/25 21:24
  • 上次更新2023/11/5 07:20:42
查看原帖
关于洛谷随机数日报
66511
DPair楼主2020/11/25 21:24

下面是日报中的 MT19937\text{MT19937} 板子

然而我们要是开启了检测 UB\text{UB}-fsanitize=undefined 编译选项,就会发现它有多处出现了 有符号整数溢出

是必须这么写吗?还是说代码有问题。。。

板子如下:

bool isInit;
int index;
int MT[624];  //624 * 32 - 31 = 19937

随机种子
void srand(int seed)
{
    index = 0;
    isInit = 1;
    MT[0] = seed;
    for(int i=1; i<624; i++)
    {
        int t = 1812433253 * (MT[i-1] ^ (MT[i-1] >> 30)) + i;
        MT[i] = t & 0xffffffff;   //取最后的32位
    }
}

梅森旋转
void generate()
{
    for(int i=0; i<624; i++)
    {
        // 2^31 = 0x80000000
        // 2^31-1 = 0x7fffffff
        int y = (MT[i] & 0x80000000) + (MT[(i+1) % 624] & 0x7fffffff);
        MT[i] = MT[(i + 397) % 624] ^ (y >> 1);
        if (y & 1)
            MT[i] ^= 2567483615;
    }
}

输出函数
int rand()
{
    if(!isInit)
        srand((int)time(NULL));
    if(index == 0)
        generate();
    int y = MT[index];
    y = y ^ (y >> 11);
    y = y ^ ((y << 7) & 2636928640);
    y = y ^ ((y << 15) & 4022730752);
    y = y ^ (y >> 18);
    index = (index + 1) % 624;
    return y;  //笔者注:y即为产生的随机数 
}
2020/11/25 21:24
加载中...