计算机仿真期末大作业Mersenne Twister随机数发生器及随机性测试

  • 格式:docx
  • 大小:146.11 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Mersenne Twister随机数发生器及随机性测试

一、实验目的

用MATLAB实现Mersenne Twister随机数发生器,并对其随机性进行测试。二、实验原理

伪随机数的产生,首先是选取种子,然后是在此种子基础上根据具体的生成算法计算得到一个伪随机数,然后利用此伪随机数再根据生成算法递归计算出下二个伪随机数,直到将所有不重复出现的伪随机数全部计算出来。这个伪随机数序列就是以后要用到的伪随机数序列。上面的计算过程可以一次性计算完毕,也可以使用一次递归计算一次,每次生成的伪随机数就是这个伪随机数序列中的一个,不过不管怎么样,只要确定了种子,确定了生成算法,这个序列就是确定的了。所谓种子,就是一个对伪随机数计算的初始值。

Mersenne Twister算法是一种随机数产生方法,它是移位寄存器法的变种。该算法的原理:Mersenne Twister算法是利用线性反馈移位寄存器(LFSR)产生随机数的,LFSR的反馈函数是寄存器中某些位的简单异或,这些位也称之为抽头序列。一个n位的LFSR能够在重复之前产生2^n-1位长的伪随机序列。只有具有一定抽头序列的LFSR才能通过所有2^n-1个内部状态,产生2^n - 1位长的伪随机序列,这个输出的序列就称之为m序列。为了使LFSR成为最大周期的LFSR,由抽头序列加上常数1形成的多项式必须是本原多项式。一个n阶本原多项式是不可约多项式,它能整除x^(2*n-1)+1而不能整除x^d+1,其中d能整除2^n-1。例如(32,7,5,3,2,1,0)是指本原多项式x^32+x^7+x^5+x^3+x^2+x+1,把它转化为最大周期LFSR就是在LFSR小邓第32,7,5,2,1位抽头。利用上述两种方法产生周期为m的伪随机序列后,只需要将产生的伪随机序列除以序列的周期,就可以得到(0,1)上均匀分布的伪随机序列了。

伪代码如下:

// 建立624位随机序列数组

int[0..623] MT

int index = 0

//初始化随机序列数组

function initializeGenerator(int seed) {

MT[0] := seed

for i from 1 to 623 {

MT[i] := last 32 bits of(1812433253 * (MT[i-1] xor(right shift by 30 bits(MT[i-1]))) + i) // 0x6c078965

}

}

//根据index的值提取数组中的某个数来生成随机数

// 每624个数调用一次generateNumbers() 函数

function extractNumber() {

if index == 0 {

generateNumbers()

}

int y := MT[index]

y := y xor (right shift by 11 bits(y))

y := y xor(left shift by 7 bits(y) and (2636928640)) // 0x9d2c5680 y := y xor(left shift by 15 bits(y) and(4022730752)) // 0xefc60000 y := y xor (right shift by 18 bits(y))

index := (index + 1) mod 624

return y

}

//产生随机数

function generateNumbers() {

for i from 0 to 623 {

int y := 32nd bit of(MT[i]) + last 31 bits of(MT[(i+1) mod624]) MT[i] := MT[(i + 397) mod 624] xor (right shift by 1 bit(y)) if (y mod 2) != 0 { // y is odd

MT[i] := MT[i] xor (2567483615) // 0x9908b0df

}

}

}

三、程序结构说明

函数的伪代码已经在实验原理中给出。

1,main.m文件:

输入随机序列的种子(默认为1);输入随机码个数(默认为100)。

调用initializeGenerator函数,初始化随机序列数组。

调用extractNumber()函数生成M个随机序列,存储到result中。

进行随机性测试,画出随机数分布图。

2,initializeGenerator.m文件:

initializeGenerator函数:初始化随机序列数组的长度和值

3,extractNumber.m文件:

extractNumber()函数:根据index的值提取数组中的某个数,调用generateNumbers()函数来生成随机数

4,generateNumbers.m文件:

generateNumbers()函数:产生随机数

四、代码:

五、结果及分析

1.输入随机序列种子和随机码个数:

2.随机码的分布图如下

六、心得体会

MT算法的中文资料很罕见,很多教材、参考书上在讲述随机数发生器时只提到线性同余算法,所以在理解实验原理时遇到了很大困难。

后来终于查找到了关于MT算法的外文资料,认真阅读后消除了编写代码前的障碍。

本实验中用到了MT19937,这是MT的一种变体,可以产生32位整数序列。具有以下的优点:

有219937− 1的非常长的周期。在许多软件包中的短周期—232随机数产生器在一个长周期中不能保证生成随机数的质量。

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

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