JAVA梅森旋转随机算法_梅森旋转算法
概念
梅森旋转算法(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梅森旋转随机算法_梅森旋转算法相关推荐
- 【Matlab】智能优化算法_蜻蜓优化算法DA
[Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...
- 【Matlab】智能优化算法_蚁狮优化算法ALO
[Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...
- 【Matlab】智能优化算法_灰狼优化算法GWO
[Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...
- JAVA梅森旋转随机算法_伪随机数生成算法-梅森旋转(Mersenne Twister/MT)
今天主要是来研究梅森旋转算法,它是用来产生伪随机数的,实际上产生伪随机数的方法有很多种,比如线性同余法, 平方取中法等等.但是这些方法产生的随机数质量往往不是很高,而今天介绍的梅森旋转算法可以产生高质 ...
- java set第n位_数据结构与算法——常用数据结构及其Java实现
本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上.亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位. 常用数据结构 数组 数组 ...
- java 最少使用(lru)置换算法_缓存置换算法 - LRU算法
LRU算法 1 原理 对于在内存中并且不被使用的数据块就是LRU,这类数据需要从内存中删除,以腾出空间来存储常用的数据. LRU算法(Least Recently Used,最近最少使用),是内存管理 ...
- 方形物体绕中心旋转的扭力_三维旋转
chopper:目录zhuanlan.zhihu.com 本篇文章主要介绍三维空间下旋转的三种表示形式:四元数.矩阵和欧拉角,阐述了三种旋转表示的数学原理并且对比了它们的优缺点.目录结构: 四元数 ...
- java 投票算法_摩尔投票算法 - woshixin的个人空间 - OSCHINA - 中文开源技术交流社区...
摩尔投票算法(Moore majority vote algorithm) 这个在wiki的介绍在https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_m ...
- java 排名算法_排行榜的算法
好久不来博客园了,前几天更新个人状态时,也把"技术博客"四个字改成了"荒废已久的博客". 好久不总结自己的工作和学习了,怎么说也过不去,就来这写一篇浅显的文章, ...
- 蒙特卡洛粒子滤波定位算法_蒙特卡罗定位算法(基于粒子滤波的定位算法) ——原理、理解与仿真...
1 算法原理 1.1 机器人定位问题 关于机器人定位,有三大问题,它们分别是: (1)"全局定位":指初始位置未知,机器人靠自身运动确定自己在地图中的位姿. (2)"位姿 ...
最新文章
- 百度地图——判断一个点是否在一个区域内?
- ActiveReports 报表应用教程 (10)---交互式报表之向下钻取(详细数据按需显示解决方案)...
- 字符串匹配算法(BF RK)
- 成交量与股价关系的深度剖析 (一)
- 2字节取值范围_高中数学:构造不等式,解析几何范围题的有效解法
- java第六次实验——多线程
- 编译原理0909的作业
- jdbc连接oracle查询数据库,JDBC连接Oracle数据库,并操作数据库,查询表
- Windows无法安装到这个磁盘 选中的磁盘具有MBR分区表解决方法
- redux-saga源码解析
- 百度网盘IDM快速下载
- adb shell 小米手机_小米手机ADB删除系统应用去广告。
- 2021年《初级会计实务》考试真题资产部分
- 关于线性回归和逻辑回归一些深入的思考
- html标签中before,css中before是什么意思?
- 攻防世界reverse高手进阶 ----- gametime
- Java程序员推荐书目
- 闹钟定时设计c语言编程,单片机定时闹钟(课程设计).docx
- kafka代码初步涉猎,用代码发送消息到客户端
- 申请ISO13485认证的周期及费用