算法设计与分析实验报告
实验四随机数产生器
院系:
班
级: 学号: 姓名
: 任课教师: 成
绩
:
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 ) //产生种子 {
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
函数Random 的输入参数n
2. 源程序代码
#include #include int d;
long My_Rand(long a,long c,long m) {
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("%d %d",&x,&y);
printf("随机数的个数:"); scanf("%d",&k); for(i=0;i
R=rand()%y;
if(R>x)printf("%d ",R);
if(i%10>=9)printf("\n"); }
finish=clock();
printf("\n所需时间:%f ms\n",(finish-start)); }
五.程序运行结果
分别在不同范围内产生不同个数的随机数,运行结果如截图所示:
六.实验结果分析
第一个截图中产生100个1到1000的随机数所需时间4187ms ,第二个截图中产生48个9到999的随机数所需时间13594ms ,第三个截图中产生10个1到99的随机数所需时间4194ms ,从运行结果初步得出产生随机数所要的时间可能不与产生随机数的个数有关,可能和产生的随机数本身有关。
七.结论
测试报告:由于是用线性同余法产生随机数,因此在相同的范围内会产生一样的随机数,如每组随机数中都有41,经过多次测试只要在相同范围内都用此种方法都会产生一定相同的随机数。
算法设计与分析实验报告
实验四随机数产生器
院系:
班
级: 学号: 姓名
: 任课教师: 成
绩
:
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 ) //产生种子 {
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
函数Random 的输入参数n
2. 源程序代码
#include #include int d;
long My_Rand(long a,long c,long m) {
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("%d %d",&x,&y);
printf("随机数的个数:"); scanf("%d",&k); for(i=0;i
R=rand()%y;
if(R>x)printf("%d ",R);
if(i%10>=9)printf("\n"); }
finish=clock();
printf("\n所需时间:%f ms\n",(finish-start)); }
五.程序运行结果
分别在不同范围内产生不同个数的随机数,运行结果如截图所示:
六.实验结果分析
第一个截图中产生100个1到1000的随机数所需时间4187ms ,第二个截图中产生48个9到999的随机数所需时间13594ms ,第三个截图中产生10个1到99的随机数所需时间4194ms ,从运行结果初步得出产生随机数所要的时间可能不与产生随机数的个数有关,可能和产生的随机数本身有关。
七.结论
测试报告:由于是用线性同余法产生随机数,因此在相同的范围内会产生一样的随机数,如每组随机数中都有41,经过多次测试只要在相同范围内都用此种方法都会产生一定相同的随机数。