随机数生成器

合集下载

vhdl随机数生成电路

vhdl随机数生成电路

vhdl随机数生成电路一、引言VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,它可以用来描述数字电路的行为和结构。

在数字电路中,随机数生成器是一个重要的组成部分。

本文将介绍如何使用VHDL来实现一个随机数生成器电路。

二、随机数生成器的原理随机数生成器是一个能够产生无规律的数字序列的设备或程序。

在数字电路中,我们可以使用基于物理噪声或伪随机数算法的随机数生成器。

1. 基于物理噪声的随机数生成器基于物理噪声的随机数生成器利用了自然界中存在的噪声信号作为输入源。

这些噪声信号包括热噪声、光子计数器和放大器等。

这种方法产生出来的数字序列具有真正意义上的随机性。

2. 伪随机数算法伪随机数算法是一种基于计算方法产生无规律数字序列的方法。

它通过一个确定性算法产生出看起来像是无规律序列的数字集合。

这种方法产生出来的数字序列并不具有真正意义上的随机性,但是可以满足大多数应用场景。

三、使用VHDL实现伪随机数生成器在数字电路中,我们一般使用伪随机数算法来实现随机数生成器。

下面是一个使用VHDL实现伪随机数生成器的示例代码。

1. 顶层模块顶层模块是整个电路的入口,它包含了时钟信号、复位信号和数据输出端口等。

```vhdlentity random isport (clk: in std_logic;rst: in std_logic;data_out: out std_logic_vector(31 downto 0));end entity random;```2. 子模块子模块包括状态寄存器、反馈函数和输出函数。

```vhdlentity lfsr isport (clk: in std_logic;rst: in std_logic;data_out: out std_logic_vector(31 downto 0) );end entity lfsr;architecture rtl of lfsr issignal state_reg: std_logic_vector(31 downto 0); beginprocess(clk, rst)beginif (rst = '1') thenstate_reg <= (others => '0');elsif rising_edge(clk) thenstate_reg <= state_reg(30 downto 0) & feedback(state_reg);end if;end process;data_out <= output(state_reg);end architecture rtl;function feedback(reg: std_logic_vector(31 downto 0)) return std_logic isvariable bit_22, bit_30, bit_31: std_logic;beginbit_22 := reg(22) xor reg(23);bit_30 := reg(6) xor reg(7) xor reg(21) xor reg(22);bit_31 := reg(0) xor reg(1) xor reg(8) xor reg(30);return bit_22 xor bit_30 xor bit_31;end function feedback;function output(reg: std_logic_vector(31 downto 0)) return std_logic_vector isbeginreturn std_logic_vector(reg);end function output;```四、总结本文介绍了随机数生成器的原理和使用VHDL实现伪随机数生成器的方法。

cryptgenrandom的用法

cryptgenrandom的用法

cryptgenrandom的用法[cryptgenrandom的用法]一、引言在计算机科学领域中,随机性是一个非常重要的概念。

随机数生成器是用于生成随机数字或者随机字节序列的工具,而cryptgenrandom就是其中之一。

本文将详细介绍cryptgenrandom的用法,并逐步回答与其相关的问题。

二、什么是cryptgenrandom?cryptgenrandom是Windows操作系统中的一个API(Application Programming Interface)。

它可以用于生成具有高度随机性的数字或者字节序列。

cryptgenrandom是Cryptographic Application Programming Interfaces(CAPI)的一部分,主要用于加密操作和安全性提升。

三、如何使用cryptgenrandom?1. 引入头文件在开始使用cryptgenrandom之前,我们需要引入相应的头文件。

在C++中,可以使用以下代码实现:cpp#include <wincrypt.h>2. 初始化随机数生成器在使用cryptgenrandom之前,我们需要先对随机数生成器进行初始化。

这可以通过调用CryptAcquireContext函数来完成:cppHCRYPTPROV hCryptProv;CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0);3. 生成随机数一旦随机数生成器初始化成功,我们就可以使用cryptgenrandom函数来生成随机数字或者字节序列。

以下是一个生成随机数的示例:cppBYTE randomBytes[16];CryptGenRandom(hCryptProv, sizeof(randomBytes), randomBytes);4. 清理资源当我们完成随机数的生成后,应该及时清理相关资源,以确保程序的效率和安全性。

随机数生成器公式

随机数生成器公式

随机数生成器公式随机数生成器公式,这玩意儿听起来是不是有点神秘又有点高大上?其实啊,它在我们的生活和学习中还挺常见的。

先来说说啥是随机数。

随机数啊,就像是老天爷闭着眼睛随便扔出来的数字,没有啥规律可言。

比如说抽奖的时候,电脑随机抽出的中奖号码,那就是随机数。

那随机数生成器公式是咋回事呢?简单来说,就是通过一些数学的方法和规则,让计算机或者其他工具能够“制造”出看起来像是随机出现的数字。

咱们就拿一个简单的例子来说吧。

假设我们要在 1 到 100 之间生成随机数,有一种常见的方法是用编程语言里的随机函数。

就像在Python 里,可以用“random.randint(1, 100)”这个命令,每次运行,它都会给出一个 1 到 100 之间的随机数。

我记得有一次,我们班上搞活动,要通过随机数来决定谁先上台表演节目。

我就用电脑上的随机数生成器来操作,同学们那叫一个紧张又兴奋,眼睛都紧紧盯着屏幕,等着看谁是那个幸运儿。

当第一个随机数出来的时候,被选中的同学先是一愣,然后满脸通红地走上台,大家都哈哈大笑。

再深入一点说,随机数生成器公式可不只是这么简单。

有些更复杂的公式,是为了让生成的随机数更符合真正的随机特性。

比如说,要避免出现连续出现相同数字的情况,或者要保证每个数字出现的概率都差不多。

还有啊,随机数生成器在科学研究里也大有用处。

比如说做模拟实验的时候,需要用随机数来模拟各种不确定的因素。

像研究天气变化、金融市场的波动,都得靠随机数生成器来帮忙。

在游戏开发中,随机数生成器也是不可或缺的。

想象一下,要是游戏里的怪物出现、宝藏掉落都是固定的,那多没意思啊!有了随机数,每次玩游戏都有新的惊喜和挑战。

不过,随机数生成器也不是完美无缺的。

有时候,由于算法的限制,可能会出现一些不太随机的情况。

比如说,在某些情况下,可能会出现一小段数字看起来有规律的现象。

总之,随机数生成器公式虽然看起来有点复杂,但它真的给我们的生活和各种领域带来了很多有趣和有用的东西。

随机数生成器

随机数生成器

随机数的原理与计算机实现摘要:随机数在计算机网络信息安全中起着至关重要的作用。

本文将对随机数,随机数产生器如何用计算机语言(JAVA )实现做简要介绍。

Abstract :Random number in the computer network information security plays a vital role. This will be random numbers, random number generator to use the computer language (JAVA) to achieve a brief introduction.关键字:随机数、计算机网络信息安全、JAVA 、随机数产生器Keyword :Random numbers, computer network and information security, JAVA, random number generator一、随机数简介什么叫随机数呢?由具有已知分布的总体中抽取简单子样,在蒙特卡罗方法中占有非常重要的地位。

总体和子样的关系,属于一般和个别的关系,或者说属于共性和个性的关系。

由具有已知分布的总体中产生简单子样,就是由简单子样中若干个性近似地反映总体的共性。

随机数是实现由已知分布抽样的基本量,在由已知分布的抽样过程中,将随机数作为已知量,用适当的数学方法可以由它产生具有任意已知分布的简单子样。

在连续型随机变量的分布中,最简单而且最基本的分布是单位均匀分布。

由该分布抽取的简单子样称,随机数序列,其中每一个体称为随机数。

单位均匀分布也称为[0,1]上的均匀分布,其分布密度函数为:分布函数为 :由于随机数在蒙特卡罗方法中占有极其重要的位置,我们用专门的符号ξ表示。

由随机数序列的定义可知,ξ1,ξ2,…是相互独立且具有相同单位均匀分布的随机数序列。

也就是说,独立性、均匀性是随机数必备的两个特点。

随机数具有非常重要的性质:对于任意自然数s ,由s 个随机数组成的s 维空间上的点(ξn+1,ξn+2,…ξn+s )在s 维空间的单位立方体G s 上均匀分布,即对任意的a i ,如下等式成立:⎩⎨⎧≤≤=其他,010,1)(x x f ⎪⎩⎪⎨⎧>≤≤<=1,110,0,0)(x x x x x F si a i ,,2,1,10 =≤≤∏=+==≤si ii i n a s i a P 1),,1,( ξ其中P (·)表示事件·发生的概率。

根密钥 密钥材料-概述说明以及解释

根密钥 密钥材料-概述说明以及解释

根密钥密钥材料-概述说明以及解释1.引言1.1 概述在当今信息技术高速发展的背景下,随着互联网、移动通信和云计算等技术的普及和广泛应用,数据的安全性和保密性变得尤为重要。

为了确保数据的机密性和完整性,加密技术成为了保护数据安全的重要手段。

加密技术的基础是密钥管理,而根密钥和密钥材料作为密钥管理的核心部分,具有至关重要的作用。

根密钥是指在一个密钥系统中拥有最高权限、最高安全性的密钥。

它是生成和管理其他密钥的根源,决定着密钥体系的稳定性和安全性。

密钥材料则是指用于生成密钥的必要信息和数据。

密钥材料的保密性与随机性非常重要,它们既可以是数字字符串,也可以是硬件设备等。

密钥材料的安全性直接关系到加密算法的强度和密钥的保密性,因此密钥材料的生成、存储和分发必须要具备高度的安全性。

本文将从根密钥和密钥材料的概念、特点和重要性等方面进行探讨。

首先,我们将对根密钥的定义和作用进行详细介绍,探究其在密钥管理中的地位。

其次,我们将讨论密钥材料的生成、存储和分发等关键问题,探求保证密钥材料安全性的方法和技术。

最后,我们将总结根密钥与密钥材料的重要性,并对未来的发展前景进行展望。

通过本文的研究,我们可以更好地理解根密钥和密钥材料在信息安全中的关键作用,为密钥管理提供一定的理论和实践参考。

同时,也能为加强数据保护、提高网络安全水平做出一定的贡献。

1.2 文章结构本文分为引言、正文和结论三个部分。

引言部分首先对本文的主题进行概述,介绍了根密钥和密钥材料的基本概念和重要性。

接着,说明了文章的结构安排,即引言部分、正文部分和结论部分。

正文部分包括2.1根密钥和2.2密钥材料两个小节。

2.1 根密钥部分详细介绍了根密钥的含义、作用以及生成方式。

首先,解释了根密钥在密码学中的重要性,它是整个密钥体系的基础,用于保护其他密钥的安全性。

其次,介绍了根密钥的生成方式,包括随机生成和基于硬件的生成等方法。

最后,讨论了根密钥的存储和管理问题,强调了对根密钥的保护和监管必不可少。

真随机数生成器原理

真随机数生成器原理

真随机数生成器原理全文共四篇示例,供读者参考第一篇示例:真随机数生成器(TRNG)是指通过利用无法预测的物理或生物过程生成的随机数的设备。

相较于伪随机数生成器(PRNG),真随机数生成器生成的随机数更具有随机性和不可预测性,能够在安全性要求高的领域发挥重要作用。

在计算机科学、密码学、模拟计算等领域,真随机数生成器广泛应用。

真随机数生成器的工作原理主要基于物理或生物过程的不可预测性。

常用的物理过程包括量子效应、热噪声、光电效应等;生物过程则包括人类感知、动物运动等。

通过利用这些过程,可以获取到具有高度随机性的数据,从而生成真随机数。

量子效应是一种常用的真随机数生成器的物理原理。

在量子物理学中,一个系统的状态可以是多个状态的线性叠加,而当这个系统被观测时,其状态会坍缩为一个确定的状态。

量子效应的不可预测性保证了生成的随机数的高度随机性。

通过利用量子效应,可以构建基于量子比特的真随机数生成器。

另一个常用的真随机数生成器原理是热噪声。

在物理系统中,由于温度的存在,会导致电子的不规则运动和碰撞,产生电子在电路中随机分布的现象。

通过测量这些不规则的电信号,可以获取到高度随机的数据,从而生成真随机数。

热噪声真随机数生成器具有结构简单、易实现的特点,被广泛应用于各种场景。

光电效应也是一种常用的真随机数生成器原理。

在光电转换器件中,当光子撞击材料表面时,会引发电子的光电发射现象。

由于光子的不可预测性,引发的光电发射现象也是不可预测的,从而可以作为真随机数生成器的输入源。

光电效应真随机数生成器具有高速、实时性强的特点,适用于要求高速随机数生成的场景。

在生物过程方面,人类感知也可以作为真随机数生成器的原理。

在密码学中,可以利用人类对随机性的感知来生成真随机数。

通过让人类在一组随机数中选择特定的数字或位置,可以获取到高度随机的数据。

由于人类的感知能力是不可预测的,因此生成的随机数也具有高度的随机性。

除了以上介绍的几种原理外,还有许多其他物理或生物过程可以作为真随机数生成器的原理,例如原子核衰变、混沌系统等。

基于FPGA的随机小数发生器及其生成方法

基于FPGA的随机小数发生器及其生成方法

基于FPGA的随机小数发生器及其生成方法FPGA(Field Programmable Gate Array)是一种可编程逻辑器件,被广泛应用于数字信号处理和数字电路设计中。

在很多情况下,需要产生一些随机的数字。

在本文中,我们将介绍使用FPGA实现随机数生成器的方法以及其生成方法。

一、FPGA实现随机数生成器的方法在FPGA中实现随机数生成器的主要方法是使用基于硬件随机数生成器的模块。

硬件随机数生成器通常使用基于物理随机现象的原理,例如温度变化,电压噪声等。

这类原理的随机性是天然的,因此可以通过它产生高质量的随机数。

随机数生成器模块实际上是一个包含一些函数和逻辑的电路板。

它通常由三个基本模块组成,分别是输入、控制和输出模块。

输入模块用于确定要生成的随机数类型和长度。

控制模块用于控制随机数生成器的工作,例如初始化和重置随机数生成器,控制采集速率和检查随机数的质量等。

输出模块用于输出生成的随机数序列。

二、FPGA随机数发生器的生成方法随机数生成器可能会生成不同类型的随机数。

有些类型随机数比其他类型随机数更适合特定的应用。

下面列出了一些随机数类型及其生成方法。

1. 真随机数:真随机数是从物理过程中收集的数字。

例如,它可以是根据波动性噪声进行采样生成的。

因为真随机数是天然的,所以非常适合安全应用。

真随机数生成器可以通过使用硬件和噪声发生器来实现。

噪声发生器可用于收集真随机数的物理噪声成分,例如温度、电场和光。

2. 伪随机数:伪随机数是非随机数序列,经过置换、屏蔽等方法处理后,具有随机数的一些属性。

在计算机系统中,伪随机数通常由大量数学操作生成。

在FPGA中实现伪随机数生成有很多方法。

最常见的方法是使用伪随机数生成算法进行实现,例如线性反馈移位寄存器(LFSR)方法。

3. 混沌随机数:混沌随机数是由混沌系统生成的随机数,这些系统通常由非线性常微分方程组成。

混沌随机数生成器通常采用放大迭代和模数操作。

比较常用的混沌随机数生成器有洞簧系统和蛤蟆映射系统。

随 机 数 生 成 器

随 机 数 生 成 器

利用泊松分布实现随机数生成器不多说,直接上代码,这是在华师大算法课上做的实验代码,C++可运行。

#includeiostream#includetime.h#includecmathusing 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 operationsRandom::Random(bool pseudo)Post: The values of seed, add_on, and multiplier areinitialized. 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 -1double 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);double product = random_real();int count = 0;while (product limit) {count++;product *= random_real();return count;void Random::randomByAvg(double avg,int num) { double p = 1 - 1.0 - (avg + 1);int t;double sum=0,ave;for(int i=0;inum;i++){t=poisson(avg);coutt" ";coutendl;ave=sum-num*1.0;cout"随机整数序列的平均值为:"aveendl;int main(){cout"请输入概率均值:"endl;double rand;cinrand;cout"请输入随机整数的个数:"endl;--产生随机序列Random random;int t;double sum=0;random.randomByAvg(rand,num);return 0;运行结果:int t; -- t为n最大倍数,且满足 t = m * mprintf ("It is %lf.-n", random ()) ;std::uniform_real_distributiondouble dis2(0.0, 1.0);SplittableRandom random = new SplittableRandom();生成10000个数然后计算分布比例应该可以,只要在90%上下就算通过。

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

随机数生成器一、随机数1.1随机数的概念数学上是这样定义随机数的:在连续型随机变量的分布中,最简单而且最基本的分布是单位均匀分布。

由该分布抽取的简单子样称为随机数序列,其中每一个体称为随机数。

单位均匀分布即[0,1]上的均匀分布。

由随机数序列的定义可知,ξ1,ξ2,…是相互独立且具有相同单位均匀分布的随机数序列。

也就是说,独立性、均匀性是随机数必备的两个特点。

1.2随机数的分类随机数一般分为伪随机数和真随机数。

利用数学算法产生的随机数属于伪随机数。

利用物理方法选取自然随机性产生的随机数可以看作真随机数。

实用中是使用随机数所组成的序列,根据所产生的方式,随机数序列再可以分为两类:1.伪随机数序列伪随机数序列由数学公式计算所产生。

实质上,伪随机数并不随机,序列本身也必然会重复,但由于它可以通过不同的设计产生满足不同要求的序列且可以复现(相同的种子数将产生相同的序列),因而得到广泛的应用。

由伪随机数发生器所产生的伪随机数序列,只要它的周期足够长并能通过一系列检验,就可以在一定的范围内将它当作真随机数序列来使用。

2.真随机数序列真随机数序列是不可预计的,因而也不可能出现周期性重复的真正的随机数序列。

它只能由随机的物理过程所产生,如电路的热噪声、宇宙噪声、放射性衰变等。

按照不同的分类标准,随机数还可分为均匀随机数和非均匀随机数,例如正态随机数。

1.3随机数的衡量标准在实际模拟过程中,我们一般只需要产生区间[0,1]上的均匀分布随机数,因为其他分布的随机数都是由均匀分布的随机数转化来的。

实用中的均匀随机数主要通过以下三个方面来衡量其随机性能的高低。

1.周期性伪随机数序列是由具有周期性的数学公式计算产生,其本身也必然会表现出周期性,即序列中的一段子序列与另一段子序列相同。

它的周期必须足够长,才能为应用提供足够多的可用数据。

只有真随机数序列才能提供真正的、永不重复的随机数序列。

2.相关性随机数发生器所产生的一个随机数序列中的各个随机数应该不相关,所产生的各个随机数序列中的随机数也应该不相关。

真随机数序列自然地满足这种不相关性。

对于伪随机数发生器,应该仔细地设计所用的数学公式,以尽量满足不相关的要求。

3.分布均匀性包括蒙特卡洛计算在内的大多数应用都要求所采用的随机数序列服从均匀分布,即同一范围内的任一个数出现的概率相同。

从均匀分布的随机数序列也很容易导出其它类型分布的随机数序列。

1.4常用的随机数生成方法目前已经出现了多种随机数生产生方法,主要有以下三种 1.人工方法通过拋硬币、扔骰子等方法获得随机序列。

由这类方法产生的随机序列具有高度的随机性,但是这种方法效率极低。

2.利用计算机生成伪随机数这是最常见的随机序列产生方法,它是基于“随即种子”产生的。

由计算机算法来获得的随机序列是有规律可循的,所以其安全性较差。

3.通过检测随机噪声源来获取真随机数产生真随机数需要熵源即随机源,目前熵源一般是通过检测放射性衰变、粒子轨迹、电子电路噪声、大气噪声、机械振动噪声、电子振荡器频率抖动等物理噪声来获取的。

由于这些装置结构复杂,操作繁琐,有些还对人体具有一定的危险性,使得目前这类随机数产生方法既不方便,也不实用。

二、利用计算机生成伪随机数的方法2.1 平方取中法2.1.1迭代算法平方取中法是由冯·诺依曼提出的。

它的实现方法为:首先任取一个非0的2m 位的数,用它中间的m 位数码作为所生成的伪随机序列的第一个元素,然后将该数做平方运算,得到一个新的2m 位的数,取其中间m 位作为伪随机序列的第二个元素,依次进行。

当取十进制时,用公式可表示为:)10](mod 10[22/1m n m n r r ⨯=-+2.1.2程序及讨论 sum=0;x(1)=65215; m=5; n=100; for i=1:nx(i+1)=mod(10^(-m/2)*x(i)^2,10^m); r(i)=x(i+1)*10^(-m); sum=sum+r(i); endplot(r,'.'); grid on ;Avg=sum/n %均值 s=0; for i=1:ns=s+(r(i)-Avg)^2; endS=s/(n-1) %方差 Stdv=S.^0.5 %标准差 figure; hist(r,5);axis([-0.1,1.1,0,28]); colormap([0.8,0.8,0.8]);图1和图2为初值x0=65215时由平方取中法得到的伪随机序列和统计直方图。

)(x E =0.5117,)(x D =0.0758,)(x σ=0.2753。

0102030405060708090100平方取中法产生的伪随机序列00.20.40.60.81统计直方图(平方取中法)图1 平方取中法产生的随机序列(x0=65215) 图2 随机序列统计直方图(100点) 图3和图4为初值x0=500时由平方取中法得到的伪随机序列和统计直方图。

可以看到从86点以后序列全部退化为0。

)(x E = 0.4000,)(x D = 0.1030,)(x σ = 0.3209平方取中法产生的伪随机序列00.20.40.60.81统计直方图(平方取中法)图3 平方取中法产生的随机序列(x0=500) 图4 随机序列统计直方图(100点) 这种方法比较容易实现,但是它的周期受初始值的影响很大,初始值选得不好,会严重影响随机数序列的质量和周期。

2.1.3周期退化问题这种平方取中法并不是生成伪随机序列的好方法。

它的缺点在于这样产生的序列中很容易出现重复元素的短循环,而且,一旦某一个元素是0,则后面所有的元素都将是0(如图3)。

如果生成的序列中,有从最高位开始连续m/2个0的数,则产生的序列会逐渐退化到0。

这是因为在十进制表示的情况下:2/10m n r <,2/210m n n r r ⨯<,则由迭代公式可得:n n r r <+1。

或者生成的序列中,有从最低位起至少连续的m/2+1个0的数,则产生的序列也会逐渐退化到0。

这是因为:如果生成序列中n r 满足上述条件,则2n r 从末位起至少有m+2个0,即是说,i n r +末位的0比1-+i n r 末位的0多,从而逐渐退化为全0。

当生成的序列中,有从最低位起有连续的m/2个0的数,则生成的序列元素,从最低位起,有一半的位为0。

它的最长周期已由m 退化为m/2,这样的数,已不适合再称为伪随机数。

平方取中法有一些变形和推广。

其中之一就是:后一个序列元素不再只依赖于前一个元素,而是依赖于前几个,甚至是不相邻的几个序列元素。

这种变形和推广使得序列的周期长度通常大于m ,但产生的序列的随机性需要经过检验。

2.2 线性同余法LCG (Linear Congruence Generator)2.2.1迭代算法在伪随机数的产生方式中最常见的就是线性同余法,生成公式:0,mod )(1≥+=+n m c aX X n n其中: m ,模数;m>0a ,乘数;0 ≤a <m c ,增量;0 ≤c <m0X ,初始值,种子;0 ≤0X <m如果这些参数和种子(初值)都指定,序列也就确定下来了。

通常取M X r i i /=作为区间(0,1)上均匀分布U(0,1)的随机数。

线性同余法中一个最重要的特例是c=0,这时也称乘同余法。

当模数M 足够大时,用线性同余法产生的随机数在区间(0,1)很密集,而且接近均匀分布,其随机数序列具有较好的统计特性。

虽然序列的参数,如乘子、增量和模数对随机数的质量和周期影响很大,但是它们都有自己的选取准则,可以使产生的随机数序列性能最优。

模数m 取得较大,序列的周期才可能较大。

当c =0时,生成序列可能达到的极大周期等于模数m 的欧拉函数φ(m),若满足:1)初始值r0与m 互素, 2)乘数a 是模m 的本原元, 则可以实现这一周期。

2.2.2程序及讨论x(1)=1; a=14; c=0; m=17; n=100; sum=0; for i=1:nx(i+1)=mod(a*x(i)+c,m); r(i)=x(i)/m; sum=sum+r(i); endplot(r,'.');grid on ;Avg=sum/n %均值 s=0; for i=1:ns=s+(r(i)-Avg)^2; endS=s/(n-1) %方差 Stdv=S.^0.5 %标准差grid on ;图5产生的序列为M X r i i /=,其中17mod 141i i X X =+,i r 被看作是 (0,1)上的随机数。

当0X =1时,它产生周期为16的如下序列i X :1,14,9,7,13,12,15,6,16,3,8,10,4,5,2,11,1…010203040506070809010000.20.40.60.81统计直方图(线性同余法)图5 线性同余法产生的随机序列 图6 随机序列统计直方图(100点) (a=14,c=0,m=17))(x E = 0.4982,)(x D = 0.0744,)(x σ = 0.2728令100mod )311(1+=+i i X X ,产生周期为50的序列如图7。

0102030405060708090100线性同余法产生的伪随机序列00.20.40.60.81统计直方图(线性同余法)图7 线性同余法产生的随机序列 图8 随机序列统计直方图(100点) (a=11,c=3,m=100))(x E = 0.4950,)(x D = 0.0841,)(x σ = 0.2899容易看出,线性同余发生器有长周期相关现象。

在应用中,我们应特别警惕和回避这种现象。

如果几个并行处理器分别使用同一个同余序列的不同段落,分割时就应避开具有强相关的分点。

另外其周期和分布受参数影响显著,例如,图5周期为16,图7周期为50;图5所示序列分布不够均匀(见图6)。

参考:(0,1)均匀分布的均值为0.5,方差为0.0833,标准差为0.2887。

2.3Fibonacci 序列2.3.1迭代算法Fibonacci 方法也是产生随机数的一种常用方法,它只要两个初值和一个模数即可,其递推公式如下所示:M X X X i i i mod )(11-++=从公式可以看出,用此方法产生的随机数序列周期为3M/2,而且没有乘法运算,因此其生成速度非常快,物理实现也十分简单。

2.3.2程序及讨论 x(1)=1;x(2)=1; m=100; n=100; sum=0; for i=2:nx(i+1)=mod(x(i)+x(i-1),m); r(i)=x(i)/m; sum=sum+r(i); endplot(r,'.'); grid on ;Avg=sum/n %均值 s=0; for i=1:ns=s+(r(i)-Avg)^2; endS=s/(n-1) %方差 Stdv=S.^0.5 %标准差 figure; hist(r,5);axis([-0.1,1.1,0,25]); colormap([0.8,0.8,0.8]);图9和图10为初值x0=1,x1=1,m=100时由Fibonacci 序列生成的100点伪随机序列和统计直方图。

相关文档
最新文档