概念
梅森旋转算法(Mersenne twister),可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷。
常见的两种为基于32位的 MT19937和基于64位的 MT19937-64。
由于梅森旋转算法是利用线性反馈移位寄存器(LFSR)产生随机数的,
对于LFRS有结论:一个 $k$ 位的移位寄存器,选取合适的特征多项式(即加1为本原多项式)时,取得最大周期 $2^k-1$.
而MT19937梅森旋转算法的周期为 $2^{19937}-1$(正如算法名,这是一个梅森素数),说明它是一个19937级的线性反馈移位寄存器,梅森旋转算法是利用线性反馈寄存器一直进行移位旋转,因此实际上 MT19937-32只需要用32位就能做到。它能做到在 $1 \leq k\leq 623$ 都可以均匀分布。
注:梅森素数:如果形如 $2^n-1$ 的数是一个素数,则称之为梅森素数。
算法步骤
整个算法主要分为三个阶段:
- 第一阶段:获得基础的梅森旋转链;
- 第二阶段:对于旋转链进行旋转算法;
- 第三阶段:对于旋转算法所得的结果进行处理;
算法实现的过程中,参数的选取取决于梅森素数,故此得名。
实现
使用MT19937算法生成范围在 $[2^{32}-1]$ 的均匀分布的32位整数。
#include <iostream> #include <string.h> #include <stdio.h> #include <time.h> using namespace std; bool isInit; int index; unsigned int MT[624]; //624 * 32 - 31 = 19937