梅森旋转算法

定义:梅森旋转算法(Mersenne twister)是一个伪随机数发生算法。由松本真和西村拓士在1997年开发,基于有限二进制字段上的矩阵线性递归。可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷。

其中,最为广泛使用Mersenne Twister的一种变体是MT19937,可以产生32位整数序列。具有以下的优点:

  1. 周期非常长,达到2−1。尽管如此长的周期并不必然意味着高质量的伪随机数,但短周期(比如许多旧版本软件包提供的2)确实会带来许多问题。

  2. 在1 ≤k≤ 623的维度之间都可以均等分布(参见定义)。

  3. 除了在统计学意义上的不正确的随机数生成器以外,在所有伪随机数生成器法中是最快的(当时

实现过程:

整个算法主要分为三个阶段:

第一阶段:获得基础的梅森旋转链;

第二阶段:对于旋转链进行旋转算法;

第三阶段:对于旋转算法所得的结果进行处理;

算法实现的过程中,参数的选取取决于梅森素数,故此得名。

MT19937

在讨论之前,引入MT19937-32的生成python代码:(此代码在 [0,2^32-1] 生成的伪随机数基本大致相同)

def _int32(x):return int(0xFFFFFFFF & x)class MT19937:# 根据seed初始化624的statedef __init__(self, seed):self.mt = [0] * 624self.mt[0] = seedself.mti = 0for i in range(1, 624):self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i)# 提取伪随机数def extract_number(self):if self.mti == 0:self.twist()y = self.mt[self.mti]y = y ^ y >> 11y = y ^ y << 7 & 2636928640y = y ^ y << 15 & 4022730752y = y ^ y >> 18self.mti = (self.mti + 1) % 624return _int32(y)# 对状态进行旋转def twist(self):for i in range(0, 624):y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff))self.mt[i] = (y >> 1) ^ self.mt[(i + 397) % 624]if y % 2 != 0:self.mt[i] = self.mt[i] ^ 0x9908b0df

接下来,我们观察上面MT19937的代码,我们可以发现代码分为四个部分:

一、_int32(x)模块

返回一个32位的二进制代码。

二、__init__(self, seed):

首先,我们必须要知道seed在代码中是种子,意思是基于已知的seed生成624个state块(伪随机数通过对不同的state块进行变换求得),我们先将state的第一个数值定为seed,代码中的623个循环便是通过state间的变换求出求出剩下的state块。

三、extract_number(self)

MT19937算法通过此模块来得到不同的伪随机数。首先,我们先进行判断,如果此时self.mti指向第一个state,我们运行__init__(self, seed):得到623个state值,如果不是,则直接进入下面的伪随机数生成过程:用通过seed求得的state值进行代码中的变换求得并返回我们所需的伪随机数。

四、twist(self):

如果只有上面的块,那么只能求得624个不同的伪随机数,但是MT19937-32却可以求出2^32-1个不同的伪随机数便是因为这个模块。旋转模块基于上一次循环中我们已经使用过的624个state值,一一对应,通过原代码中的:

y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff))
self.mt[i] = (y >> 1) ^ self.mt[(i + 397) % 624]

if y % 2 != 0:
self.mt[i] = self.mt[i] ^ 0x9908b0df

求得新的624个与上一次循环中不同的state值,并进入新的循环中。

MT19937的反推导

引入反推导代码:

#python2
from Crypto.Util import number# right shift inverse
def inverse_right(res, shift, bits=32):tmp = resfor i in range(bits // shift):tmp = res ^ tmp >> shiftreturn tmp# right shift with mask inverse
def inverse_right_mask(res, shift, mask, bits=32):tmp = resfor i in range(bits // shift):tmp = res ^ tmp >> shift & maskreturn tmp# left shift inverse
def inverse_left(res, shift, bits=32):tmp = resfor i in range(bits // shift):tmp = res ^ tmp << shiftreturn tmp# left shift with mask inverse
def inverse_left_mask(res, shift, mask, bits=32):tmp = resfor i in range(bits // shift):tmp = res ^ tmp << shift & maskreturn tmpdef extract_number(y):y = y ^ y >> 11y = y ^ y << 7 & 2636928640y = y ^ y << 15 & 4022730752y = y ^ y >> 18return y&0xffffffffdef recover(y):y = inverse_right(y,18)y = inverse_left_mask(y,15,4022730752)y = inverse_left_mask(y,7,2636928640)y = inverse_right(y,11)return y&0xffffffffdef transform(message):assert len(message) % 4 == 0new_message = ''for i in range(len(message) / 4):block = message[i * 4 : i * 4 +4]block = number.bytes_to_long(block)block = convert(block)block = number.long_to_bytes(block, 4)new_message += blockreturn new_messagetransformed_flag = '641460a9e3953b1aaa21f3a2'
c = transformed_flag.decode('hex')
flag = transform(c)
print flag.encode('hex')

反推导就是我们在知道通过Mt19937算法求得的y1,来反推出用于MT19937算法的state原始值y。而异或的反推则是再异或相同的数就可以消去这个相同的数。

那么,我们先分析生成代码中所有的不同生成方式(主要分为 ">>" "<<" ">> &" "<< &"),所以,我们可以看到反推导代码中先将不同的生成方式写出(前四个),在其中,bits // shift是个难点,我们可以作以下分析:

MT19937算法的基本思路大致如此。

MT19937(梅森旋转算法)相关推荐

  1. JAVA梅森旋转随机算法_梅森旋转算法

    概念 梅森旋转算法(Mersenne twister),可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷. 常见的两种为基于32位的 MT19937和基于64位的 MT19937-64 ...

  2. JAVA梅森旋转随机算法,你没听过的梅森旋转算法

    (标准开头) 如果单独提梅森旋转算法可能大家都很陌生,但如果说到C++11的random可能大家就都熟悉多了.事实上,C++,python等多种计算机语言的随机数都是通过梅森旋转算法产生的.(也有一个 ...

  3. JAVA梅森旋转随机算法,C语言实现梅森旋转算法

    原理: 梅森旋转算法是一种伪随机数生成算法 1.定义相关宏和结构体 #include #include #include #include typedef unsigned int uint; #de ...

  4. C++:实现量化Mersenne twister梅森旋转算法测试实例

    C++:实现量化Mersenne twister梅森旋转算法测试实例 #include "mersennetwister.hpp" #include "utilities ...

  5. 梅森旋转算法原理c语言,梅森旋转素数算法(MT199937)c语言代码

    满意答案 sddzycz 2016.06.23 采纳率:42%    等级:12 已帮助:8913人 #include /*Periodparameters*/ #define N 624 #defi ...

  6. python求梅森尼数_谈谈梅森旋转:算法及其爆破

    https://liam.page/https://liam.page/https://liam.page/ 现代编程语言,大都在标准库中包含了随机库.例如,C++ 在 C++11 标准中添加了 ra ...

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

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

  8. js版梅森旋转生成随机数

    用js实现, 梅森旋转生成随机数, 来代替Math.random(); 该文章参考自 梅森旋转算法--伪随机数(加密.身份信息ID号)_Touch_Dream的博客-CSDN博客 <!DOCTY ...

  9. 梅森旋转产生随机数c语言实现,C++生成随机数的实现代码

    C风格 C为随机数提供的工具是rand.srand和RAND_MAX,定义在中. srand为rand设置种子,如果不设置,相当于调用过srand(1).rand产生伪随机数,其范围为0到RAND_M ...

最新文章

  1. 深度丨霍金的去世让我想起了微软提出的人工智能十大原则
  2. 源码安装mysql主从_mysql源码安装和主从同步配置
  3. js_调试_01_14 个你可能不知道的 JavaScript 调试技巧
  4. 更深的编码器+更浅的解码器=更快的自回归模型
  5. 周源:视频加密和DRM实施实践
  6. java dao service实例_浅谈Action+Service +Dao 功能
  7. linux中的开机和关机命令
  8. c语言 嵌入式开发环境搭建,嵌入式C语言环境的搭建
  9. 边缘计算:万物互联时代新型计算模型
  10. 你三十岁有什么巨大变化吗?
  11. 十个利用矩阵解决的经典题目
  12. mysql与php的连接_PHP与Mysql的连接
  13. 国开计算机专业英语答案,国开电大计算机专业英语阅读(河北)形考三参考答案...
  14. iOS上架详细通关教程(提交到AppStore)
  15. 服务式办公室相对于传统办公室有什么不同,服务式办公室的概念
  16. 电脑如何批量下载哔哔视屏_我是电脑哔哔哔哔哔
  17. python代码 学生上课签到表_一种上课签到系统的制作方法
  18. 高质量的外链是这样做出来的
  19. 维基百科诞生,它是一个自由、免费、内容开放的网络百科全书,是世界第五大网站...
  20. XenServer关键的配置文件

热门文章

  1. 计算机没有显卡设置吗,win10右键没有显卡设置,win7显卡设置
  2. 《web课程设计》 基于HTML+CSS+JavaScript实现中国水墨风的小学学校网站模板(6个网页)
  3. 德国黑客攻破苹果Touch ID指纹识别系统
  4. 连续两年发布白皮书,京东试图通过区块链扳回一局 |追击上市公司
  5. jsjq:获取div的宽度、高度、屏幕距离方法总结
  6. python导入模块被加横线
  7. 程序员团队名称和口号_【工会活动】“强身健体营造温馨团队,心手相牵构建和谐校园” ——记赛罕区民族小学团队拓展活动...
  8. 打造中国自主知识产权的工业操作系统,赋能未来智造
  9. 我想了一晚上的一道题目:关于dfs+回溯+部分图论
  10. 华三路由追踪命令 tracert详解