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

今天主要是来研究梅森旋转算法,它是用来产生伪随机数的,实际上产生伪随机数的方法有很多种,比如线性同余法,

平方取中法等等。但是这些方法产生的随机数质量往往不是很高,而今天介绍的梅森旋转算法可以产生高质量的伪随

机数,并且效率高效,弥补了传统伪随机数生成器的不足。梅森旋转算法的最长周期取自一个梅森素数,

由此命名为梅森旋转算法。常见的两种为基于32位的MT19937-32和基于64位的MT19937-64。

由于梅森旋转算法是利用线性反馈移位寄存器(LFSR)产生随机数的,所以我们先来认识线性反馈移位寄存器。

首先,移位寄存器包括两个部分

(1)级,每一级包含一个比特,比如11010110是一个8级的移位寄存器产生的

(2)反馈函数,线性反馈移位寄存器的反馈函数是线性的,非线性反馈移位寄存器的反馈函数是非线性的

一个级的移位寄存器产生的序列的最大周期为,当然这个最大周期跟反馈函数有很大关系,线性反馈函数实

际上就是这个级的移位寄存器选取“某些位”进行异或后得到的结果,这里的“某些位”的选取很重要,得到线性反馈

函数之后,把这个移位寄存器的每次向右移动一位,把最右端的作为输出,把“某些位”的异或结果作为输入放到最左

端的那位,这样所有的输出对应一个序列,这个序列叫做M序列,是最长线性移位寄存器序列的简称。

上面“某些位”的选取问题还没有解决,那么应该选取哪些位来进行异或才能保证最长周期为,这是一个很重要

的问题。选取的“某些位”构成的序列叫做抽头序列,理论表明,要使LFSR得到最长的周期

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梅森旋转法(Mersenne Twister)是一种非常流行的生成随机数序列的算法。它是由松本真和西村拓士在1997年开发的,可以生成高质量的随机数序列。 梅森旋转法的基本思想是通过一系列的位运算和旋转操作来生成随机数。它的核心是一个624维的状态向量,每次生成一个随机数时都会对这个状态向量进行一次变换,然后取出其中的某些位作为结果。 梅森旋转法的优点是生成的随机数序列具有很好的统计特性,而且周期非常长,可以达到2^19937-1。此外,梅森旋转法的实现也非常简单。 下面是一个使用Python实现梅森旋转法的例子: ``` class MersenneTwister: def __init__(self, seed): self.mt = [0]*624 self.index = 0 self.mt[0] = seed for i in range(1, 624): self.mt[i] = (0x6c078965*(self.mt[i-1]^(self.mt[i-1]>>30))+i) & 0xffffffff def twist(self): for i in range(624): y = (self.mt[i] & 0x80000000) + (self.mt[(i+1)%624] & 0x7fffffff) self.mt[i] = self.mt[(i+397)%624] ^ (y>>1) if y%2 != 0: self.mt[i] ^= 0x9908b0df def extract_number(self): if self.index == 0: self.twist() y = self.mt[self.index] y ^= y>>11 y ^= (y<<7) & 0x9d2c5680 y ^= (y<<15) & 0xefc60000 y ^= y>>18 self.index = (self.index + 1)%624 return y mt = MersenneTwister(123) for i in range(10): print(mt.extract_number()) ``` 这个例子中,我们定义了一个MersenneTwister类,其中包含了三个方法:__init__()、twist()和extract_number()。__init__()方法用于初始化状态向量,twist()方法用于对状态向量进行一次变换,extract_number()方法用于提取一个随机数。 我们可以使用这个类来生成一个随机数序列,例如:mt = MersenneTwister(123); mt.extract_number()。这里的参数123是用来初始化状态向量的种子,可以根据需要自行更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值