算法设计与分析实验报告
实验四随机数产生器
院系:
班
级: 学号: 姓名
: 任课教师: 成
绩
:
2016年5月
计算机科学与技术
湘 潭 大 学
实验四随机数产生器
一. 实验内容
设计一个随机数发生器,可以产生分布在任意整数区间[a,b]的随机数序列。
二.实验目的
1、掌握线性同余法产生随机数的方法;
2、了解计算机中的随机数是如何产生的,以及为什么将随机数称为伪随机数。
三. 算法描述
//随机数类
Const unsigned long maxshort = 65536L; Const unsigned long multiplier = 1194211693L; Const unsigned long adder = 12345L; Class RandomNumber { private: //当前种子
unsigned long randSeed; Public:
RandomNumber(unsigned long s = 0);
//构造函数,默认值0表示由系统自动产生种子
unsigned short Random(unsigned long n); //产生0:n-1之间的随机整数 Double fRandom(void); //产生[0,1)之间的随机实数
};
函数Random在每次计算时用线性同余式计算新的种子randSeed。它的高16位随机性较好。将randSeed右移16位得到一个0~65535之间的随机整数,然后再将此随机整数映射到0~(n-1)范围内。
对于函数fRandom,先用函数Random(maxshort)产生一个0~(maxshort - 1)之间的整型随机序列,将每个整型随机数除以maxshort,就得到[0,1)区间中的随机实数。
RandomNumber :: RandomNumber(unsigned long s ) //产生种子 {
2
If (s == 0) randSeed = time(0); //用系统时间产生种子 Else randSeed = s; //由用户提供种子 }
Unsigned short RandomNumber :: Random(unsigned long n) //产生0:n-1之间的随机整数
{randSeed = multiplier * randSeed + adder; Return (unsigned short )((randSeed >>16)%n); }
Double RandomNumber :: fRandom(void) //产生[0,1)之间的随机实数 { return Random(maxshort)/double(maxshort); }
四. 算法实现
1.数据结构及函数说明
线性同余法产生伪随机数,由线性同余法产生的随机序列a1,a2,.... ,an,...满足
a0 = d
an = (b*An-1 + c) mod m n = 1,2,...
式中b>=0,c>=0,m>=0。d为该随机序列的种子。建立一个随机数类RandomNumber。该类包含一个需要由用户初始化的种子randSeed。给定初始种子后,即可产生相应的随机序列。种子randSeed是一个无符号整型数,可由用户选定也可用系统时间自动产生。函数Random的输入参数n<=65536是一个无符号整数型,它返回0到(n - 1)范围内的一个随机整数。函数fRandom返回[0,1)内的一个随机实数。
函数Random的输入参数n<=65536是一个无符号整数型,它返回0到(n - 1)范围内的一个随机整数。函数fRandom返回[0,1)内的一个随机实数。
2.源程序代码
#include
long My_Rand(long a,long c,long m) {
3
return d=(a*d+c)%m; }
long gcd1(long m,long n) { long r;
while((r=m%n)!=0) { m=n; n=r; } return n; }
long gcd(long m) {
long i=2;
while(gcd1(i,m)!=1) i++; return i; }
void main() {
double start,finish; start=clock(); long a,c,m,R; int i,k; int x,y; m=10007; a=gcd(m); c=33; d=time(0);
printf(\随机数的范围:\ scanf(\
4