概念

梅森旋转算法(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 #include#include#include

using namespacestd;boolisInit;intindex;

unsignedint MT[624]; //624 * 32 - 31 = 19937

void srand(intseed)

{

printf("seed:%d\n", seed);

index= 0;

isInit= 1;

MT[0] =seed;//对数组的其它元素进行初始化

for(int i = 1; i < 624; i++)

{

unsignedint t = 1812433253 * (MT[i - 1] ^ (MT[i - 1] >> 30)) +i;

MT[i]= t & 0xffffffff; //取最后的32位赋给MT[i]

}

}voidgenerate()

{for(int i = 0; i < 624; i++)

{//2^31 = 0x80000000//2^31-1 = 0x7fffffff

unsigned int y = (MT[i] & 0x80000000) + (MT[(i + 1) % 624] & 0x7fffffff);

MT[i]= MT[(i + 397) % 624] ^ (y >> 1);if (y & 1)

MT[i]^= 2567483615;

}

}

unsignedintRand()

{if(!isInit)

srand((int)time(NULL));if(index == 0)

generate();

unsignedint y =MT[index];

y= y ^ (y >> 11); //y右移11个bit

y = y ^ ((y << 7) & 2636928640); //y左移7个bit与2636928640相与,再与y进行异或

y = y ^ ((y << 15) & 4022730752); //y左移15个bit与4022730752相与,再与y进行异或

y = y ^ (y >> 18); //y右移18个bit再与y进行异或

index = (index + 1) % 624;returny;

}

intmain()

{int cnt = 0;for(int i = 0; i < 1000000; i++)

{if(Rand() & 1) cnt++;

}

cout<

}

应用

梅森旋转算法是R、Python、Ruby等的默认伪随机数产生器。从C++11开始,C++也可以使用这个算法。

例如C++11中:

#include #include

using namespacestd;intmain()

{

random_device rd;//可视为真随机数,但Windows下调用的rand_s就不是了

mt19937 mt(rd());for(int i = 0; i < 10; i++)

cout<< mt() <

}

参考链接:

JAVA梅森旋转随机算法_梅森旋转算法相关推荐

  1. 【Matlab】智能优化算法_蜻蜓优化算法DA

    [Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...

  2. 【Matlab】智能优化算法_蚁狮优化算法ALO

    [Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...

  3. 【Matlab】智能优化算法_灰狼优化算法GWO

    [Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...

  4. JAVA梅森旋转随机算法_伪随机数生成算法-梅森旋转(Mersenne Twister/MT)

    今天主要是来研究梅森旋转算法,它是用来产生伪随机数的,实际上产生伪随机数的方法有很多种,比如线性同余法, 平方取中法等等.但是这些方法产生的随机数质量往往不是很高,而今天介绍的梅森旋转算法可以产生高质 ...

  5. java set第n位_数据结构与算法——常用数据结构及其Java实现

    本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上.亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位. 常用数据结构 数组 数组 ...

  6. java 最少使用(lru)置换算法_缓存置换算法 - LRU算法

    LRU算法 1 原理 对于在内存中并且不被使用的数据块就是LRU,这类数据需要从内存中删除,以腾出空间来存储常用的数据. LRU算法(Least Recently Used,最近最少使用),是内存管理 ...

  7. 方形物体绕中心旋转的扭力_三维旋转

    chopper:目录​zhuanlan.zhihu.com 本篇文章主要介绍三维空间下旋转的三种表示形式:四元数.矩阵和欧拉角,阐述了三种旋转表示的数学原理并且对比了它们的优缺点.目录结构: 四元数 ...

  8. java 投票算法_摩尔投票算法 - woshixin的个人空间 - OSCHINA - 中文开源技术交流社区...

    摩尔投票算法(Moore majority vote algorithm) 这个在wiki的介绍在https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_m ...

  9. java 排名算法_排行榜的算法

    好久不来博客园了,前几天更新个人状态时,也把"技术博客"四个字改成了"荒废已久的博客". 好久不总结自己的工作和学习了,怎么说也过不去,就来这写一篇浅显的文章, ...

  10. 蒙特卡洛粒子滤波定位算法_蒙特卡罗定位算法(基于粒子滤波的定位算法) ——原理、理解与仿真...

    1 算法原理 1.1 机器人定位问题 关于机器人定位,有三大问题,它们分别是: (1)"全局定位":指初始位置未知,机器人靠自身运动确定自己在地图中的位姿. (2)"位姿 ...

最新文章

  1. 百度地图——判断一个点是否在一个区域内?
  2. ActiveReports 报表应用教程 (10)---交互式报表之向下钻取(详细数据按需显示解决方案)...
  3. 字符串匹配算法(BF RK)
  4. 成交量与股价关系的深度剖析 (一)
  5. 2字节取值范围_高中数学:构造不等式,解析几何范围题的有效解法
  6. java第六次实验——多线程
  7. 编译原理0909的作业
  8. jdbc连接oracle查询数据库,JDBC连接Oracle数据库,并操作数据库,查询表
  9. Windows无法安装到这个磁盘 选中的磁盘具有MBR分区表解决方法
  10. redux-saga源码解析
  11. 百度网盘IDM快速下载
  12. adb shell 小米手机_小米手机ADB删除系统应用去广告。
  13. 2021年《初级会计实务》考试真题资产部分
  14. 关于线性回归和逻辑回归一些深入的思考
  15. html标签中before,css中before是什么意思?
  16. 攻防世界reverse高手进阶 ----- gametime
  17. Java程序员推荐书目
  18. 闹钟定时设计c语言编程,单片机定时闹钟(课程设计).docx
  19. kafka代码初步涉猎,用代码发送消息到客户端
  20. 申请ISO13485认证的周期及费用

热门文章

  1. 一个“脱裤子放屁“的功能!
  2. python格式jpg转换png(批量处理,深度24,尺寸不变)
  3. django 导出数据到excel表 导出excel表到目标路径及客户端下载
  4. 点到线段的最短距离算法
  5. JS的DOM对象操作
  6. JavaScript IIFE
  7. 解决网络丢包问题及故障判断方法
  8. Mysql 5.7 取分组第一条
  9. ctime(ctime头文件的作用)
  10. JavaScript:实现Sudoku数独游戏算法(附完整源码)