随机数产生器

算法设计与分析实验报告

实验四随机数产生器

院系:

级: 学号: 姓名

: 任课教师: 成

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,经过多次测试只要在相同范围内都用此种方法都会产生一定相同的随机数。


相关文章

  • 均匀分布的随机数
  • 随机数的产生 摘要 本文研究了连续型随机数列的产生,先给出了均匀分布的随机数的产生算法,在通过均匀分布的随机数变换得到其他连续型随机数的产生算法.在vc环境下,我们给出了产生均匀分布随机数的算法,然后探讨了同余法的理论原理.通过均匀随机数产 ...查看


  • 物理真随机数发生器的设计
  • 第20卷第2期 2013年2月 doi:10.3969/j.issn.1671-637X.2013.02.023 电光与控制 ElectronicsOptics&Control V01.20No.2 Feb.2013 物理真随机数发 ...查看


  • 北京理工大学随机信号分析实验报告
  • 本科实验报告 实验名称: 随机信号分析实验 实验一 随机序列的产生及数字特征估计 一.实验目的 1.学习和掌握随机数的产生方法. 2.实现随机序列的数字特征估计. 二.实验原理 1.随机数的产生 随机数指的是各种不同分布随机变量的抽样序列( ...查看


  • 概率论与随机信号分析1
  • 电子科技大学中山学院学生实验报告 学院: 电子信息学院 课程名称: 概率论与随机信号分析 一.实验目的 1.了解随机数的产生方法: 2.了解常用随机数的概率分布函数.分布律和概率密度函数. 二.实验原理 随机数的产生有好多方法,可以利用乘积 ...查看


  • 机顶盒智能卡方案
  • 机顶盒智能卡方案 1 技术背景简要说明 1.1 条件接收 条件接收是指对播出的数字电视节目内容进行数字加扰以建立有效的收费体系,从而保障节目提供商和电视台的利益.条件接收技术主要有三大技术组成:加解扰技术,寻址技术和加解密技术,简单的说来, ...查看


  • 蒙特卡罗方法学习总结
  • 蒙特卡罗方法学习总结 核工程与核技术2014级3班张振华[1**********] 一.蒙特卡罗方法概述 1.1蒙特卡罗方法的基本思想 1.1.1基本思想 蒙特卡罗方的基本思想就是,当所求问题的解是某个事件的概率,或者是某个随机变量的数学期 ...查看


  • 中国与以色列合研成功新型高速真随机数发生器
  • 2013年09月04日 09:40 来源:中国科学报 分享到: 76人参与9条评论 人们日常所用的随机数大多为伪随机数,真随机数发生器在密码学.通信和国家信息安全等领域的价值极高.(资料图) 本报讯(通讯员李文记者张楠)日前,中科院苏州纳米 ...查看


  • 数据加密技术
  • 数据加密技术 数据加密技术 我们经常需要一种措施来保护我们的数据,防止被一些怀有不良用心的人所看到或者破坏.在信息时代,信息可以帮助团体或个人,使他们受益,同样,信息也可以用来对他们构成威胁,造成破坏.在竞争激烈的大公司中,工业间谍经常会获 ...查看


  • 生日相同的概率
  • 生日相同的概率(一) 教学目标 (一)教学知识点 能用实验的方法估计一些复杂的随机事件发生的概率. (二)能力训练要求 经历实验.统计等活动过程,在活动中进一步发展学生合作交流的意识和能力. (三)情感与价值观要求 通过对贴近学生生活的有趣 ...查看


热门内容