随机数和随机模拟

随机数和随机模拟
随机数和随机模拟

随机数和随机模拟

Michael T.Health 著

13.1 随机模拟

迄今为止,我们只考虑了求解数学问题的确定性方法,对于某种类型的问题,有时使用另一种称作随机模拟的方法更有效,有关随机模拟的深入研究已经超出了本书的范围,本章只对这种方法做简单的介绍,同时还要简单的介绍随机模拟所依赖的随机数发生器。

随机模拟方法是利用随机性模拟或复制系统的性态,从而得到可能结果的统计样本。由于涉及随机性,所以某些教科书中也称随机模拟为蒙特卡洛方法。这类方法一般用来研究:

> 非确定性(随机)过程;

> 复杂程度高,不能进行模拟分析的确定性系统;

> 维数较高,不易离散化的确定性系统(如蒙特卡洛积分);

随机模拟方法一般用到;

> 相关的概率分布知识;

> 能提供做出随机选择的随机数。

相关的概率分布知识与模拟的物理系统有关。举个简单的例子,在模拟棒球游戏时,由运动员击中的平均值,可以确定运动员的击中概率,更实际的例子是对穿过某种介质(如屏蔽物质)的粒子(如中子)扩散的模拟。我们需要了解的是“截面”或“平均自由路程”,它们度量了粒子发生碰撞的概率及各种可能的碰撞结果的概率,单个粒子穿过介质的路程可以用一种随机选择的序列来模拟,每种轨迹都可以以适当的概率出现,通过对大量的粒子轨迹的模拟,可以得到近似的概率分布结果,其精度依赖于实验的次数。

13.2 随机性和随机数

随机性的概念很难定义,某些物理过程,如抛硬币或者骰子,虽然是随机的,但是如果能够充分的认识它们的运动方程或者适当的初始条件,这些过程就是确定的。近年来,利用功力学中的混沌的概念,确定性和随机性的区别已经变得非常模糊。由

于这些现象对初始条件极其敏感,所以即使原理上是确定性系统,实际的结果也可能是不确定的。例如,即使涉及的物理过程非常了解,也不可能做出超过两周的详细的天气预报。

表征这种与随机性相关的不可预见性的一种方法是,如果某个数的序列不能用比它本身更简单的方式描述,就称这个数的这种序列是随机的。换句话说,没有比直接列出其成员更简捷的方式来表示一个序列。例如,虽然三个序列{1,2,3,4,5}{1,1,1,1,1}{4,1,5,2,3}出现的可能性是相等的,但是只有后者被认为是随机的,虽然在一些情况下有些变量并不是真正的随机变量,用模拟的方法对这类系统更方便更简单。

除了不可预见性之外,随机性的另一个显著特征是不可重复性。我们不可能期望一个相同的长随机数序列或者抛硬币结果出现两次。这种不可重复性使测试算法或者计算机跟踪调试程序非常困难,所以最好能用某个重复的过程产生随机数列,从这一点上说,不可重复性的作用是双重的。随机模拟的统计意义依赖于实验的独立性,而实验的独立性又与每个实验中所使用的随机数列有关。1955年,在计算机还未普及前,RAND公司曾出版了一本名为《一百万个随机数》的书,可以利用它在实验设计和模拟中选择随机的实验。但很快人们就了解到,如果每个人都从第一页开始,则所做的所有实验和模拟都与相同的随机序列有关。这个现象引起了如何从随机数表中选择一个开始点问题的争论。

13.3 随机数发生器

虽然随机数可由物理或者列表得到,但是现在它完全可以由计算机产生。用计算机生成的数表面上看是随机的,因为它们不会出现相似的分布,实际上这种算法还是确定的。产生这种随机数的算法本身就是对它所产生序列的一个简单描述,所以从定义上看,它不是真正的随机数。这种序列更准确的名字应该是伪随机数。伪随机数列表面上看是随机的,但实际上它是可预见的和可重复的,这一点对于调试模拟程序和证明某种结果是非常重要的,而且由于计算机只能表示有限多个数,所以任何序列都有重复的可能。

一个好的随机数发生器应该尽可能地具备下列性质:

>随机分布:能通过随机性的统计测试;

>长周期:复周期应尽可能的长;

>有效性: 所需要的随机数可能达到几百万个,所以应具有执行速度快,存储小的特点;

>重复性:若从同一个初始条件开始,则产生相同的序列;

>移植性:可以在不同型号的计算机上运行,而且在每种计算机上都能产生相同的随机序列。

一个随机数发生器不可能满足上述所有条件,有些随机数发生器通常产生高度相关的序列,当在空间中,将序列的连续两个或者三个元素为一组依次画出时,这种现象会表现的相当明显。由此引发了关于“随机数主要落在平面内”的评论,这样会使模拟结果无效。

早期的计算机随机数发生器往往依赖相当复杂的程序,其复杂程度往往会超过随机性本身。如“平方取中”方法,它是将序列中每个数平方,然后取结果的中间位作为序列的下一个元素。由于这种方法缺乏理论上的依据,所以产生了非常严重的后果,很快人们就认识到,具有充分理论基础的简单方法则是可行的方法。 13.3.1 同余发生器

同余随机数发生器形如1()(mod )k k x ax b M -=+

其中a,b 是给定的整数,初始整数0x 称为种子,整数M 约等于(往往等于)计算机

所能表示的最大整数。

这种发生器的质量和a 与b 的选择有关,在多数情况下,周期不会超过M ,利用这种方法可以得到一个较为合理的随机数发生器,但是a 和b 的选择必须慎重,许多计算机系统提供的随机数发生器都是同余型的,但有些就很差。

同余发生器产生的随机数介于0到M-1,为了产生区间[0,1]上均匀分布的随机浮点数,一般要将随机数整除以M (但不是用整除)。

13.3.2 斐波那契发生器

产生区间[0,1]上浮点随机数的另一个方法是斐波那契(Fibonacci )发生器,方法是用前面值的差、和、或者积产生新值,典型的例子是差发生器

175k k k x x x --=-

我们称这个发生器的滞后为17和5,毫无疑问,必须仔细选择滞后值,以产生效果较好的差发生器。这个公式的结果有可能是负的,此时补救的方法是加1,使其回到区间[0,1]。

斐波那契发生器需要的存储器比同余发生器要大,而且还要用专门的开始程序(类似于求解常微分方程的多步法)。另一方面,斐波那契发生器产生浮点随机数时候并不需要除法,设计合理的斐波那契发生器具有非常好的统计特性。斐波那契发生器的另一个优点是它的周期比同余发生器长,原因是序列中单个元素的重复性并不会使所有子序列的元素按照同一个次序重复排列。

13.3.3 非均匀分布

前面只讨论了区间[0,1]上均匀分布的随机数,如果需要区间[a,b]上的均匀分布的随机数,则可通过变换()k b a x a -+将[0,1]上的k x 变换到所需区间,得到所需的

随机数。

非均匀分布的采样要更困难一些,如果所需的概率密度函数的累积分布函数是可逆的,则可先按照所需的分布产生均匀的随机数,然后再完成逆过程。例如,比率为λ 的指数分布的密度函数为(),0x f t e t λλ-=>

累积分布函数为 0()()1x

x F x f t dt e λ-==-?

令 y=F(x) ,解出x 的 ln(1)

y x λ

-=- 则均匀分布的采样可以取 ln()k k y x λ

=-

其中 在[0,1]上均匀分布。 遗憾的是,许多重要的分布并不是可逆的,为产生某种分布的随机数,必须使用特殊的方法,其中一个重要的例子是具有一定均值和方差的正态分布随机数的生成器,上机问题前面给出了某些产生正态分布的随机数的方法,一般的正态分布随机数程序中往往假定均值为0,方差为 1.如果需要其他的均值和方差2σ ,则可用变换 k x σ

μ+使程序产生的k x 具有所需的正态分布。

13.4 伪随机序列

尽管已经有了产生随机数的方法,但是这种真正的随机性有时并不是优点,对于某些应用,如蒙特卡洛积分,使样本体积一致性收敛往往比采样点是否真正随机更重要。问题在于随机序列往往呈现出的随机数(如果完全随机,两次闪电差不多击中同一个地方);这样对给定数目的点,样本体积将不一定一致收敛。另一方面,利用规则网络上的采样点,可以得到完全一直收敛的结果,但在前面已经看到,这种方案对于高维情形并不是很好。

折中的办法是利用伪随机序列来平衡收敛性和随机性,实际上这种序列根本不随机,但是经过精心构造,可以使样本体积一致收敛,并且还能保持合理的随机状态。通过设计可以避免点的相互交叉,所以就消除了与真正随机性有关的集束现象。

随机数生成器

随机数生成器 一、随机数 1.1随机数的概念 数学上是这样定义随机数的:在连续型随机变量的分布中,最简单而且最基本的分布是单位均匀分布。由该分布抽取的简单子样称为随机数序列,其中每一个体称为随机数。单位均匀分布即[0,1]上的均匀分布。由随机数序列的定义可知,ξ1,ξ2,…是相互独立且具有相同单位均匀分布的随机数序列。也就是说,独立性、均匀性是随机数必备的两个特点。 1.2随机数的分类 随机数一般分为伪随机数和真随机数。利用数学算法产生的随机数属于伪随机数。利用物理方法选取自然随机性产生的随机数可以看作真随机数。实用中是使用随机数所组成的序列,根据所产生的方式,随机数序列再可以分为两类: 1.伪随机数序列 伪随机数序列由数学公式计算所产生。实质上,伪随机数并不随机,序列本身也必然会重复,但由于它可以通过不同的设计产生满足不同要求的序列且可以复现(相同的种子数将产生相同的序列),因而得到广泛的应用。由伪随机数发生器所产生的伪随机数序列,只要它的周期足够长并能通过一系列检验,就可以在一定的范围内将它当作真随机数序列来使用。 2.真随机数序列 真随机数序列是不可预计的,因而也不可能出现周期性重复的真正的随机数序列。它只能由随机的物理过程所产生,如电路的热噪声、宇宙噪声、放射性衰变等。 按照不同的分类标准,随机数还可分为均匀随机数和非均匀随机数,例如正态随机数。 1.3随机数的衡量标准 在实际模拟过程中,我们一般只需要产生区间[0,1]上的均匀分布随机数,因为其他分布的随机数都是由均匀分布的随机数转化来的。 实用中的均匀随机数主要通过以下三个方面来衡量其随机性能的高低。 1.周期性 伪随机数序列是由具有周期性的数学公式计算产生,其本身也必然会表现出周期性,即序列中的一段子序列与另一段子序列相同。它的周期必须足够长,才能为应用提供足够多的可用数据。只有真随机数序列才能提供真正的、永不重复的随机数序列。 2.相关性 随机数发生器所产生的一个随机数序列中的各个随机数应该不相关,所产生的各个随机数序列中的随机数也应该不相关。真随机数序列自然地满足这种不相关性。对于伪随机数发生器,应该仔细地设计所用的数学公式,以尽量满足不相关的要求。 3.分布均匀性 包括蒙特卡洛计算在内的大多数应用都要求所采用的随机数序列服从均匀分布,即同一范围内的任一个数出现的概率相同。从均匀分布的随机数序列也很容易导出其它类型分布的

VHDL产生伪随机数

Library IEEE ; use IEEE.std_logic_1164.all ; use IEEE.std_logic_arith.all ; entity lfsr is generic (data_width : natural := 8 ); port ( clk : in std_logic ; reset : in std_logic ; data_out : out UNSIGNED(data_width - 1 downto 0) ); end lfsr ; architecture rtl of lfsr is signal feedback : std_logic ; signal lfsr_reg : UNSIGNED(data_width - 1 downto 0) ; begin feedback <= lfsr_reg(7) xor lfsr_reg(0) ; latch_it : process(clk,reset) begin if (reset = '1') then lfsr_reg <= (others => '0') ;

elsif (clk = '1' and clk'event) then lfsr_reg <= lfsr_reg(lfsr_reg'high - 1 downto 0) & feedback ; end if; end process ; data_out <= lfsr_reg ; end RTL ; Reference URL:https://www.360docs.net/doc/f5328108.html,/eda/edasrc/6153.html

matlab产生随机数的方法

matlab 产生随机数的方法 第一种方法是用 random 语句,其一般形式为 y = random (' 分布的英文名 ',A1,A2,A3,m,n ) , 表示生成m 行n 列的m x n 个参数为(A1 , A2 , A3 ) 的该分 布的随机数。 例如: (1) R = random ('Normal',0,1,2,4): 生成期 望为 0, 标准差为 1 的(2 行 4 列)2 x 4个正态随机数 (2) R = random ('Poisson',1:6,1,6): 依次 生成参数为 1 到 6 的(1 行 6 列 )6 个 Poisson 随机数 第二种方法是针对特殊的分布的语句: 一. 几何分布随机数 R = geornd(P) R = geornd(P,m) (下面的 P , m 都可以是矩阵) (生成参数为 P 的几何随机数) (生成参数为 P 的 x m 个几何随机数) 1 R = geornd (P,m,n ) (生成参数为 P 的 m 行 n 列的 m x n 个几何随 机数) 例如 ⑴ R = geornd (1./ 2八(1:6))(生成参数依次为 1/2,1/2A 2,至U 1/2A 6 的 6 个几 何随机数 ) ⑵ R = geornd (0.01,[1 5])( 生成参数为0.01的(1行5列)5个几何随 机数). 二. Beta 分布随机数 R = betarnd(A,B) R = betarnd(A,B,m) 生成 m 行 n 列的 m x n 个数为 A,B 的 Beta 随 三.正态随机数 R = normrnd (MU, SIGMA ) (生成均值为 MU,标准差为SIGMA 的正态随机数) R = normrnd (MU , SIGMA,m ) (生成 1x m 个正态随机数) R = normrnd(MU , SIGMA,m,n) (生成 m 行 n 列的 m x n 个正态随机数) 例如 (1) R = normrnd(0,1,[1 5]) 生成 5 个正态 (0,1) 随机数 (2) R = normrnd([1 2 3;4 5 6],0.1,2,3) 生成期望依次为 [1,2,3;4,5,6], 方 差为 0.1 的 2x 3 个正态随机数. 生成参数为 A,B 的 Beta (生成 x m 个数为 A,B 随机数) 的 Beta 随机数) R = betarnd(A,B,m,n) 机数) .

随 机 数 生 成 器

使用python实现伪随机数生成器 在前两天学习了使用python实现伪随机数的方法,今天是时候来做一个总结了。 首先要说明的是什么是随机数,真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等。产生这些随机数的方法有很多种,而这些产生随机数的方法就称为随机数生成器。像前面说的由物理现象所产生的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。 但是在我们的实际生活中广泛应用的是伪随机数生成器,所谓的“伪”就是假的的意思,也就是说并不是真正的随机数。那么这些随机数是怎么实现的呢?这些数字是由固定的算法实现的,是有规律可循的,并不能实现真正的“随机”,但是它们具有类似于随机数的统计特征。这样的发生器叫做伪随机数发生器。 实现伪随机数的方法有很多种,如:平方取中法,线性同余法等方法。 下面主要介绍的是线性同余法,如C的rand函数和JAVA的java.util.Random类就是使用该方法实现的,其公式为:rNew = (a*rOld + b) % (end-start) 其中, a称为乘数,b称为增量,(end-start)称为模数,它们均为常数。 然后设置rOld = rNew,一般要求用户指定种子数rOld(也称为

seed),当然也可以自由选择a和b,但是两个数如果选择不好,可能会影响数字的随机性,所以一般令: a=32310901 这样使得生成的随机数最均匀。下面我是用的将种子自定义设为999999999。代码如下: def myrandint( start,end,seed=999999999 ): a=32310901 #产生出的随机数最均匀 rOld=seed m=end-start while True: #每调用一次这个myrandint函数,才生成一次随机数所以要惰性求值 rNew = (a*rOld+b)%m yield rNew rOld=rNew #模拟使用20个不同的种子来生成随机数 for i in range(20): r = myrandint(1,10000, i) #每个种子生成10个随机数 print('种子',i,'生成随机数') for j in range(10): print( next(r),end=',' ) 运行结果是使用20个不同的种子生成的随机数。

在excel中产生随机数

用excel产生随机数 统计软件提供的随机数发生器可以使我们对抽样分布进行计算机模拟,对抽样分布有更加直观的理解。Excel的分析工具库中有一个“随机数发生器”模块,可以产生服从大部分常用分布的模拟数据,但没有提供直接产生随机数的函数。在SPSS中产生随机数的函数在“Randomnumbers”类别中,相应的函数都是以Rv 开头的。 1 样本均值抽样分布的随机模拟 假总体的均值为μ,标准差为σ,则统计理论表明,不论总体的分布如何,只要样本容量n足够大,样本均值的分布总会趋向于正态分布,且均值为μ,标 准差为。 例题:假设总体为均匀分布,模拟样本均值的抽样分布。 假设总体的分布为0-1区间上的均匀分布,则总体的均值为0.5,方差等于 1/12,标准差等于0.288675。现在,我们从总体中抽取1000个样本容量为2的样本(有放回抽样),计算每个样本的样本均值,然后观察样本均值的分布状况。 新建一个Excel工作簿,单击“工具”“数据分析”“随机数发生器”,在弹出的对话框中把变量个数设为2,随机数个数为1000,选择0-1区间的均匀分布,结果放在新工作表中(图1)。把输出结果的每一行看作一个容量为2的样本,共有1000个样本。在C列中计算每个样本的均值。接下来我们就可以分析这1000个样本均值的分布状况了。由于SPSS的直方图工具更为方便,我们把相应的数据复制到SPSS中作直方图,结果如图2,抽样分布的均值为0.5097,标准差为 0.20345,理论值等于0.288675/ 2 =0.20412,两者差异不大。 图1 随机数发生器对话框

图2 样本均值的抽样分布,样本容量=2 2 样本比例抽样分布的随机模拟 样本比例实质上就是指标数值只能取0和1时的样本均值。由于在这种情况下总体的分布为0-1分布,因此在重复抽样的条件下样本均值抽样分布的理论分布是二项分布。中心极限定理表明当样本用量足够大(能够保证np≥5,nq≥5)时二项分布可以用正态分布来近似。 [例] 假设有大批零件,不合格率p为0.2。随机模拟从总体中抽取样本容量分别为5,20,50的2000个样本,分析样本比例p? 的抽样分布。 新建一个工作表,在单元格中输入图5-10左上角所示的信息作为总体:总体中取值为1(不合格)的概率为0.2,取值为0(合格)的概率为0.8。 图3 二项分布的随机模拟

第3章 随机数的产生与模拟

第三章随机数的产生与模拟目录 ?随机数的产生与模拟 ?§3.1均匀随机数的产生 ? 3.1.1线性同余法(LCG)的递推公式 ? 3.1.2反馈位移寄存器法(FSR) ? 3.1.3组合发生器 ?§3.2非均匀随机数的产生 ?§3.3 Monte Carlo方法在解确定性问题中的应用 ? 3.3.1计算定积分 ? 3.3.1.1随机投点法 ? 3.3.1.2平均值估计法 ? 3.3.1.3重要抽样法 ? 3.3.1.4分层抽样法 ? 3.3.2 计算多重积分 ? 3.3.2.1 随机投点法 ? 3.3.2.2 平均值估计法 ? 3.3.3应用实例 ?§3.4 随机模拟方法在随机服务系统中的应用 ?§3.5 随机模拟方法在理论研究中的应用

随机数的产生与模拟 用随机模拟方法解决实际问题时,首先要解决的是随机数的产生方法,或称随机变量的抽样方法。

随机数的产生与模拟 伪随机数: 在计算机上用数学方法产生均匀随机数是指按照一定的计算方法而产生的数列,它们具有类似于均匀随机变量的独立抽样序列的性质,这些数既然是依照确定算法产生的,便不可能是真正的随机数,因此常把用数学方法产生的随机数称为伪随机数。

随机数的产生与模拟 均匀分布随机数: 定理:设)(x F是连续且严格单调上升的分布函数,它的反函数存在,且记为)(1x F-, 1、若随机变量ξ的分布函数为)(x F,则)1,0(~)(U Fξ; 2、若随机变量)1,0(~U F-的分布函数为)(x F R,则)(1R

随机数的产生与模拟 均匀分布随机数: 该定理说明了任意分布的随机数均可由均匀分布的随机数变换得到。常简称的随机数为均匀分布随机数。 )1,0(U )1,0(U

MATLAB伪随机数发生器

MATLAB伪随机数发生器.txt生活是过出来的,不是想出来的。放得下的是曾经,放不下的是记忆。无论我在哪里,我离你都只有一转身的距离。 均匀性较好的随机数生成 zz from https://www.360docs.net/doc/f5328108.html,/lanmuyd.asp?id=3379 随机数生成算法[1]是一类重要的算法,广泛应用于仿真技术等场合。然而,目前的伪随机数生成器(Pseudo-random number generator, PRNG)[2]存在一个重要缺陷,即样本分布与真实分布不一致,这主要发生在以下两种情况:①抽样代价过高,样本数目较少;②空间维数较高[3]。 因此,有必要寻找一类新的随机数发生器。准随机数发生器(Quasi-random number generator,QRNG)[4]能够生成稳定、低差异性的(low-discrepancy)样本,而与样本数目或空间维数无关[5]。故针对蒙特卡罗积分结果不稳定的情况,提出一种基于QRNG的蒙特卡罗积分,发现比传统方法性能有所提升。 伪随机数介绍 伪随机数是由确定的算法生成的,其分布函数与相关性均能通过统计测试。与真实随机数的差别在于,它们是由算法产生的,而不是一个真实的随机过程。一般地,伪随机数的生成方法主要有以下3种[6]: (1)直接法(Direct Method),根据分布函数的物理意义生成。缺点是仅适用于某些具有特殊分布的随机数,如二项式分布、泊松分布。 (2)逆转法(Inversion Method),假设U服从[0,1]区间上的均匀分布,令X=F-1(U),则X的累计分布函数(CDF)为F。该方法原理简单、编程方便、适用性广。 (3)接受拒绝法(Acceptance-Rejection Method):假设希望生成的随机数的概率密度函数(PDF)为f,则首先找到一个PDF为g的随机数发生器与常数c,使得f(x)≤cg(x),然后根据接收拒绝算法求解。由于算法平均运算c次才能得到一个希望生成的随机数,因此c的取值必须尽可能小。显然,该算法的缺点是较难确定g与c。 因此,伪随机数生成器(PRNG)一般采用逆转法,其基础是均匀分布,均匀分布PRNG 的优劣决定了整个随机数体系的优劣[7]。下文研究均匀分布的PRNG。 伪随机数生成器的缺点 重复做N=10000次试验,每次产生S=20与S=100个随机分布的样本,同时采用Kolmogorov- Smirnov假设检验(hypothesis test)来确定样本是否满足均匀分布。规定: ① 0假设(null hypothesis)为样本服从均匀分布;② 1假设(alternative hypothesis)为样本不服从均匀分布。 采用P值(∈[0, 1])衡量,P值越趋近于0,表示越有理由拒绝0假设,即样本不服从均匀分布;P值越趋近于1,表示越有理由接受0假设,即样本服从均匀分布。 如图1与图2所示:随着P值下降,样本也越来越不服从均匀分布。实践中希望P值越大越好。然而统计学的结论显示,P值一定服从均匀分布,与N、S大小无关,这表明由于随机性,总会出现某次抽样得到的样本不服从、甚至远离均匀分布。另外,样本大小的不同,造成检验标准的不同,直观上看S=100对应的均匀分布普遍比S=20对应的更均匀。因此,小样本情况下均匀分布PRNG的差异性尤为严重。

随机数生成器功能:1,产生一个随机概率,.doc

随机数生成器功能:1,产生一个随机概率, 2产生一个a到b之间的随机整数 3,产生一个指定长度的随机数组,里面存放随机的布尔值,表示染色体 package edu.zsu.zouang.util;//java.util中的Random使用指定的伪随机原随即更改指定列表的序列 import java.util.Random;//import导入,导入random类,用于产生伪随机数流 public class Randomizer { private int lower; private int upper; private static Random random = new Random();//生成random实例 public Randomizer(int lower, int upper){ if(upper <= lower){ throw new IllegalStateException("Upper is smaller than lower!"); } this.lower = lower; this.upper = upper; } public Double nextDouble(){//返回概率 return Double. (upper - lower) * random.nextDouble()); }//Random中double nextDouble()返回下一个伪随机数,它是从伪随机数生成器的序列中取出的在0.0到1.0之间的double值 //double.valueof(str)说明把str转化成double类型的对象,相当于强制转换 public Integer nextInteger(){//返回整数lower到upper之间 return Integer.valueOf(lower +random.nextInt(upper - lower)); }//Random(int)返回0到int之间的整数随机值 public char[] nextBitArray(int length){//生成指定长度的字符数组,存放基因系列 if(length <= 0){ throw new IllegalStateException("Length is less than ZERO!"); } char[] temp = new char[length]; for(int i = 0; i < length ; i++){ temp[i] = random.nextBoolean() ? '1' : '0'; }//Random.nextBoolean()返回随机的bool值

信息安全基础综合实验讲义(伪随机数产生器)-2012版

第二部分 伪随机数产生器实验 在密码技术中,建立单个数是“随机的”并没有意义。对随机性的要求总是基于数的序列而言。真正的随机数符合均匀分布且其生成不能重现。计算机通过算法产生的随机数并不是真正意义上的随机数序列,只能称为伪随机数序列。产生伪随机数序列的算法称为伪随机数产生器。产生高质量的伪随机数序列对信息的安全性具有十分重要的作用,比如密钥产生、数字签名、身份认证和众多的密码学协议等都要用到随机序列。 一、实验目的 熟悉常用的伪随机数产生器算法。运用高级程序设计语言实现一种伪随机数产生器算法的程序,加深对伪随机数产生器算法的理解。 二、实验原理 计算机产生的随机数是使用确定的算法计算出来的。一旦知道了随机数算法和初始种子,就能够知道随机序列中任何一个随机数的值,因此,计算机产生的随机数是一种伪随机数。伪随机数的生成算法称为伪随机数产生器。伪随机数有多种生成算法。 1. 线性同余算法 到目前为止,使用最为广泛的随机数产生技术是由Lehmer 首先提出的称为线性同余算法,即使用下面的线性递推关系产生一个伪随机数列x 1,x 2,x 3,… 这个算法有四个参数,分别是: a 乘数 0 ≤ a < m c 增量 0 ≤ c < m m 模数 m > 0 x 0 初始种子(秘密) 0 ≤ x 0 < m 伪随机数序列{ x n }通过下列迭代方程得到: 1()mod n n x ax c m +=+ 如果m 、a 、c 和x 0都是整数,那么通过这个迭代方程将产生一系列的整数,其中每个数都在0 ≤ x n < m 的范围内。数值m 、a 和c 的选择对于建立一个好的伪随机数产生器十分关键。为了形成一个很长的伪随机数序列,需要将m 设置为一个很大的数。一个常用准则是将m 选为几乎等于一个给定计算机所能表示的最大非负整数。因而,在一个32位计算机上,通常选择的m 值是一个接近或等于231的整数。此外,为了使得随机数列不易被重现,

FPGA产生基于LFSR的伪随机数

FPGA产生基于LFSR的伪随机数 1.概念 通过一定的算法对事先选定的随机种子(seed)做一定的运算可以得到一组人工生成的周期序列,在这组序列中以相同的概率选取其中一个数字,该数字称作伪随机数,由于所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。这里的“伪”的含义是,由于该随机数是按照一定算法模拟产生的,其结果是确定的,是可见的,因此并不是真正的随机数。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要,如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。 2.由LFSR引出的产生方法 产生伪随机数的方法最常见的是利用一种线性反馈移位寄存器(LFSR),它是由n个D触发器和若干个异或门组成的,如下图: 其中,gn为反馈系数,取值只能为0或1,取为0时表明不存在该反馈之路,取为1时表明存在该反馈之路;n个D触发器最多可以提供2^n-1个状态(不包括全0的状态),为了保证这些状态没有重复,gn的选择必须满足一定的条件。下面以n=3,g0=1,g1=1,g2=0,g3=1为例,说明LFSR的特性,具有该参数的LFSR 结构如下图:

假设在开始时,D2D1D0=111(seed),那么,当时钟到来时,有: D2=D1_OUT=1; D1=D0_OUT^D2_OUT=0; D0=D2_OUT=1; 即D2D1D0=101;同理,又一个时钟到来时,可得D2D1D0=001. ……………… 画出状态转移图如下: 从图可以看出,正好有2^3-1=7个状态,不包括全0; 如果您理解了上图,至少可以得到三条结论: 1)初始状态是由SEED提供的; 2)当反馈系数不同时,得到的状态转移图也不同;必须保证g n===1,否则哪来的反馈? 3)D触发器的个数越多,产生的状态就越多,也就越“随机”; 3.verilog实现

随 机 数 生 成 器

利用泊松分布实现随机数生成器 不多说,直接上代码,这是在华师大算法课上做的实验代码,C++可运行。 #includeiostream #includetime.h #includecmath using namespace std; class Random { Random(bool pseudo = true); double random_real(); int random_integer(int low, int high); int poisson(double mean); void randomByAvg(double avg,int num); private: int reseed(); -- Re-randomize the seed. int seed,multiplier,add_on; -- constants for use in arithmetic operations Random::Random(bool pseudo) Post: The values of seed, add_on, and multiplier are initialized. The seed is initialized randomly only if pseudo == false.

if (pseudo) seed = 1; else seed = time(NULL) % INT_MAX; multiplier = 2743; add_on = 5923; int Random::reseed() Post: The seed is replaced by a pseudorandom successor. seed = seed * multiplier + add_on; return seed; double Random::random_real() Post: A random real number between 0 and 1 is returned. double max = INT_MAX + 1.0; --INT_MAX = (2)31 -1 double temp = reseed(); if (temp 0) temp = temp + max; return temp - max; int Random::random_integer(int low, int high) Post: A random integer between low and high is returned. if (low high) return random_integer(high, low); else return ((int) ((high - low) * random_real())) + low; int Random::poisson(double mean) Post: A random integer, reflecting a Poisson distribution with parameter mean, is returned. double limit = exp(-mean);

随机数生成器

湖北轻工职业技术学院 实验报告 题目:随机数生成器 专业:电子信息工程技术 姓名: 学号: 班级:10电信 指导老师: 2012年5月29日

目录 引言 (3) 一、总体方案的设计 (4) 二、单元电路的设计 (4) (一) NE555的引脚与功能 (4) (二) CD4017的引脚与功能 (5) (三)实物正反面图 (6) 三、使用元件 (7) 四、电路组装\调试过程中遇到的问题及解决办法 (7) 五、分析与心得 (8)

引言 随机数是专门的随机试验的结果。随机数最重要的特性是:它所生成的后面的那个数与前面的那个数毫无关系。首先需要声明的是,计算机不能生成绝对随机的随机数(“真随机数”),只能生成“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会生成一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。未来的量子计算机有可能生成基于自然规律的不可重现的“真随机数”。在统计学的不同技术中需要使用随机数。比如:1、在从统计总体中抽取有代表性的样本的时候2、在将实验动物分配到不同的试验组的过程中3、在进行蒙特卡罗模拟法计算的时候等等。实际生活中,这些随机数起着很大的作用,所以很多人会专门去寻找随机数生成器。比如:1、对银行来说,银行的ID和密码非常脆弱。如果有随机数表,就可以防备此类事件。随机数表是指为每个客户指定各不相同的数字列表,申请时将该随机数表分配给客户,而不是按照一定的规律给出,这就安全很多。2、要考察某公司的牛奶产品质量,想从800袋牛奶中抽取60袋,就可以在随机数表中选中一数,并用向上、下、左、右不同的读法组成60个数,并按牛奶的标号进行检测,虽然麻烦,但很常用。3、企业要调查消费者对某产品的需求量,要从很多消费者中抽选一定数量的样本调查。

实验计算机模拟

实验:计算机模拟 一、实验目的和要求 1. 掌握计算机模拟的基本原理及方法; 2. 掌握利用随机数解决问题; 二、实验内容 1.已知零件C由零件A和零件B连接而成,已知零件A、B的长度为随机变量, aaa=[]; for i=1:10 a=rand; if a<=007 a1=5; elseif a>0.07&&a<=0.26 a1=6; elseif a>0.26&&a<=0.64 a1=7; elseif a>0.64&&a<=0.89 a1=8; elseif a>0.89&&a<=1 a1=9; end b=rand; if b<=0.23 b1=14; elseif a>0.23&&a<=0.64 b1=15; elseif a>0.64&&a<=0.91 b1=16; elseif a>0.91&&a<=1 b1=17; end c=a1+b1 aaa=[aaa a1+b1];

end 运行xxx得到以下结果 :xxx c = 21 c = 19 c = 20 c = 21 c = 20 c = 20 c = 21 c = 19 c = 19 c = 19 >> mean(aaa) ans = 19.9000 10个样本计算C的平均长度为19。 单件成本7 8 9 10 11 12 概率0.05 0.15 0.2 0.3 0.25 0.05 定价\概率\预计销售500 600 700 800 900 19 0.05 0.15 0.4 0.25 0.15 20 0.3 0.2 0.2 0.2 0.1 21 0.2 0.3 0.35 0.1 0.05 量时,每件以5元处理) 根据题设编写代码:a.m b=[500 600 700 800 900]; a=[19,20,21]; x1=rand; if x1<0.05 c=7; elseif x1>0.05&x2<0.20 c=8; elseif x1>0.20&x1<0.4 c=9;

C++随机数的生成

标准库(被包含于中)提供两个帮助生成伪随机数的函数: 函数一:int rand(void); 从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。 函数二:void srand(unsigned seed); 参数seed是rand()的种子,用来初始化rand()的起始值。 可以认为rand()在每次被调用的时候,它会查看: 1)如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。 2)如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。 根据上面的第一点我们可以得出: 1)如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed 一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。 2)否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值。 3)如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。 举几个例子,假设我们要取得0~6之间的随机整数(不含6本身): 例一,不指定seed: for(int i=0;i<10;i++){ ran_num=rand() % 6; cout<

计算机随机数模拟随机试验教学反思

《计算机随机数模拟随机试验》教学反思 1.教学内容分析 本节课是一节数学与信息技术的结合课。处于数学进入选择性必修二,讲完4.1节《条件概率与事件的独立性》4.2节《随机变量》中4.2.3《二项分布和超几何分布》。信息技术课讲完Excle的应用之后。随着计算机科学、人工智能的迅猛发展,人们获取数据和处理数据的能力都得到很大的提升。为了让我们的学生适应这种变化,计算机与学科的融合不容忽视。这节课我们主要要让学生熟悉用随机数模拟随机试验及对试验数据的理解处理。数学建模是对现实问题进行数学抽象数学建模是对现实问题进行数学抽象,用数学语言表达问题、用数学方法构建模型解决问题的素养。这节课我们以随机数模拟为载体在探究随机数模拟随机试验的过程中,锻炼学生在实际情境中从数学的视角发现问题、提出问题,分析问题、建立模型,确定参数、计算求解,检验结果、改进模型,最终解决实际问题的能力。发展学生数学抽象,数学建模的数学核心素养。 2.学习者分析 我校属于省级示范校,学生基础相对较好,具备一定的自主探究能力,同时在本学期的数学学习中刚刚学习过条件概率与事件的独立性,二项分布和超几何分布。信息技术课刚刚学习过Excle的应用。从而具备了探索建立适当模型去模拟随机试验,通过数据分析估计事件概率的可能性。学生的困难在于分析问题解决问题策略的选择,在现有数据基础上得出合理结果,实验结果与理论结果的差异分析。 3.学习目标确定 (1)会使用Excel中Rand()函数的若干功能; (2)通过“三门问题”的模拟实验了解计算机模拟的可行性和优越性; (3)通过小组合作探究提升学生在实际情境中从数学的视角发现问题、提出问题,分析问题、建立模型,确定参数、计算求解,检验结果、改进模型,最终解决 实际问题的能力,发展学生数学抽象,数学建模的数学核心素养。 4.教学重难点 教学重点:建立适当的模型模拟随机试验,实验得到的频率值与概率值的比较。 教学难点:分析问题解决问题策略的选择特色学习资源分析与技术手段应用说明 5教学过程 (1)随机模拟方法的基本思想是:为了求解数学、物理、工程技术以及生产管理等方面

C怎样产生随机数

C怎样产生随机数 问:怎样产生随机数? 答:在计算机中并没有一个真正的随机数发生器,但是可以做到使产生的数字重复率很低,这样看起来好象是真正的随机数,实现这一功能的程序叫伪随机数发生器。 有关如何产生随机数的理论有许多,如果要详细地讨论,需要厚厚的一本书的篇幅。不管用什么方法实现随机数发生器,都必须给它提供一个名为“种子”的初始值。而且这个值最好是随机的,或者至少这个值是伪随机的。“种子”的值通常是用快速计数寄存器或移位寄存器来生成的。 下面讲一讲在C语言里所提供的随机数发生器的用法。现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下: 1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535; 2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间) 3) 根据需要多次调用rand(),从而不间断地得到新的随机数; 4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。 这个过程看起来很简单,问题是如果你每次调用srand()时都提供相同的种子值,那么,你将会得到相同的随机数序列,这时看到的现象是没有随机数,而每一次的数都是一样的了。例如,在以17为种子值调用srand()之后,在首次调用rand()时,得到随机数94。在第二次和第三次调用rand()时将分别得到26602和30017,这些数看上去是很随机的(尽管这只是一个很小的数据点集合),但是,在你再次以17为种子值调用srand()后,在对于rand()的前三次调用中,所得的返回值仍然是在对94,26602,30017,并且此后得到的返回值仍然是在对rand()的第一批调用中所得到的其余的返回值。因此只有再次给srand()提供一个随机的种子值,才能再次得到一个随机数。 下面的例子用一种简单而有效的方法来产生一个相当随机的“种子”值----当天的时间值:#include #include #include #include void main(void) { int i; unsigned int seedVal; struct timeb timeBuf; ftime(&timeBuf); seedVal=((((unsigned int)timeBuf.time&0xFFFF) (unsigned int)https://www.360docs.net/doc/f5328108.html,litm)^ (unsigned int)https://www.360docs.net/doc/f5328108.html,litm); srand((unsigned int)seedVal);

随机数生成及控制

随机数生成及控制 对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。一般地,我们使用同系统时间有关的参数作为随机种子,这也是.net中的随机数发生器默认采用的方法。 我们可以使用两种方式初始化一个随机数发生器: 第一种方法不指定随机种子,系统自动选取当前时间作为随机种子: Random ro = new Random(); 第二种方法可以指定一个int型参数作为随机种子: int iSeed=10; Random ro = new Random(10);

之后,我们就可以使用这个Random类的对象来产生随机数,这时候要用到Random.Next()方法。这个方法使用相当灵活,你甚至可以指定产生的随机数的上下限。 不指定上下限的使用如下: int iResult; iResult=ro.Next(); 下面的代码指定返回小于100的随机数: int iResult; int iUp=100; iResult=ro.Next(iUp); 而下面这段代码则指定返回值必须在50-100的范围之内: int iResult; int iUp=100; int iDown=50; iResult=ro.Next(iDown,iUp);

(整数值)随机数的产生

---------------------------------------------------------------最新资料推荐------------------------------------------------------ (整数值)随机数的产生 3.2.2 (整数值)随机数的产生一、教学目标: 1、知识与技能: (1)了解随机数的概念,掌握用计算器或计算机产生随机数求随机数的方法;(2)能用模拟的方法估计概率。 2、过程与方法: (1)通过对现实生活中具体的概率问题的探究,感知应用数学解决问题的方法,体会数学知识与现实世界的联系,培养逻辑推理能力;(2)通过模拟试验,感知应用数学解决问题的方法,自觉养成动手、动脑的良好习惯。 3、情感态度与价值观: 通过模拟方法的设计体验数学的重要性和信息技术在数学中的应用;通过动手模拟,动脑思考,体会做数学的乐趣;通过合作试验,培养合作与交流的团队精神。 二、重点与难点: 重点: 随机数的产生;难点: 利用随机试验求概率. 三、教学过程(一)、引入情境: 历史上求掷一次硬币出现正面的概率时,需要重复掷硬币,这样不断地重复试验花费的时间太多,有没有其他方法可以代替试验呢?我们可以用随机模拟试验,代替大量的重复试验,节省时间. 1/ 5

本节主要介绍随机数的产生,目的是利用随机模拟试验代替复杂的动手试验,以便求得随机事件的频率、概率. (二)、产生随机数的方法: 1.由试验(如摸球或抽签)产生随机数例:产生 125 之间的随机整数. (1)将 25 个大小形状相同的小球分别标 1,2, , 24, 25,放入一个袋中,充分搅拌 (2)从中摸出一个球,这个球上的数就是随机数 2.由计算器或计算机产生随机数由于计算器或计算机产生的随机数是根据确定的算法产生的,具有周期性(周期很长),具有类似随机数的性质,但并不是真正的随机数,而叫伪随机数由计算器或计算机模拟试验的方法为随机模拟方法或蒙特卡罗方法。 (三)、利用计算器怎样产生随机数呢?例 1: 产生 1 到25 之间的取整数值的随机数. 解: 具体操作如下: 第一步: MODEMODEMODE10 第二步: 25SHIFTRAN#+0.5= 第三步: 以后每次按= 都会产生一个 1 到 25 的取整数值的随机数. 工作原理: 第一步中连续按 MODE 键三次,再按 1 是使计算器进入确定小数位数模式,0表示小数位数为 0,即显示的计算结果是进行四舍五入后的整数;第二步是把计算器中产生的 0.000~0.999 之间的一个随机数扩大 25 倍,使之产生0.00024.975 之间的随机数,加上+0.5后就得到 0.5~25.475 之间的随机数;再由第一步所进

随机数生成及其在统计模拟中的应用

随机数生成及其在统计模拟中的应用 黄湘云 关键词:随机数; 统计检验; 模拟 审稿:郎大为、边蓓蕾;编辑:吴佳萍 揭秘统计软件如 R,Octave,Matlab 等使用的随机数发生器,然后做一些统计检验,再将其应用到独立随机变量和的模拟中,最后与符号计算得到的精确结果比较。除特别说明外,文中涉及到的随机数都是指伪随机数,发生器都是指随机数发生器。 背景 随机数的产生和检验方法是蒙特卡罗方法的重要部分,另外两个是概率分布抽样方法和降低方差提高效率方法。在 20 世纪 40 年代中期,当时为了原子弹的研制,乌拉姆(S.Ulam)、冯诺依曼(J.von Neumann)和梅特罗波利斯(N. Metropolis)在美国核武器研究实验室创立蒙特卡罗方法。当时出于保密的需要,与随机模拟相关的技术就代号“蒙特卡罗”。早期取得的成果有产生随机数的平方取中方法,取舍算法和逆变换法等。这两个算法的内容见统计之都王夜笙的文章。 随机数生成 讲随机数发生器,不得不提及一个名为 Mersenne Twister(简称 MT)的发生器,它的周期长达219937?1,现在是R 、Octave 和 Matlab等软件(较新版本) 的默认随机数发生器。 Matlab通过内置的rng函数指定不同的发生器,其中包括1995年Matlab采用George Marsaglia 在1991年提出的借位减(subtract with borrow,简称SWB)发生器。在Matlab中,设置如下命令可指定发生器及其状态,其中1234是随机数种子,指定发生器的状态,目的是重复实验结果,v5uniform是发生器的名字。 rng(1234, 'v5uniform') Octave 通过内置的rand函数指定发生器的不同状态,为获取相同的两组随机数,state 参数得设置一样,如1234(你也可以设置为 别的值)。Octave已经放弃了老版本内置的发生器,找不到命令去指定早期的 发生器,这个和 Matlab 不一样。 rand ('state',1234) rand(1,5)

相关文档
最新文档