搜档网
当前位置:搜档网 › 基于FPGA的m伪随机数产生

基于FPGA的m伪随机数产生

基于FPGA的m伪随机数产生
基于FPGA的m伪随机数产生

用C语言产生随机数

用c语言产生随机数 在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。 可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。 rand()会返回一随机数值,围在0至RAND_MAX 间。返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,(其值至少为32767),运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。具体见下面的例子。 一如何产生不可预见的随机序列呢 利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。

在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值围从0~65535; 2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间) 3) 根据需要多次调用rand(),从而不间断地得到新的随机数; 4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。 下面是0~32767之间的随机数程序: #include #include #include //使用当前时钟做种子 void main( void ) {int i; srand( (unsigned)time( NULL ) ); //初始化随机数for( i = 0; i < 10;i++ ) //打印出10个随机数 printf( " %d\n", rand() ); } 根据上面的程序可以很容易得到0~1之间的随机数:

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.sodocs.net/doc/b25825916.html,/eda/edasrc/6153.html

伪随机数列发生器-TsouShih

8位伪随机数列发生器 天津工业大学理学院 XXX XXXXXXX 2011年12月09日

背景 如果一个序列,一方面它是可以预先确定的,并且是可以重复地生产和复制的;一方面它又具有某种随机序列的随机特性(即统计特性),我们便称这种序列为伪随机序列。因此可以说,伪随机序列是具有某种随机特性的确定的序列。它们是由移位寄存器产生确定序列,然而他们却具有某种随机序列的随机特性。因为同样具有随机特性,无法从一个已经产生的序列的特性中判断是真随机序列还是伪随机序列,只能根据序列的产生办法来判断。伪随机序列系列具有良好的随机性和接近于白噪声的相关函数,并且有预先的可确定性和可重复性。这些特性使得伪随机序列得到了广泛的应用,特别是在CDMA系统中作为扩频码已成为CDMA技术中的关键问题。伪随机序列的特性对系统的性能有重要的影响,因此有必要了解和掌握伪随机序列的的概念和特性。 原理 伪随机数列的概念与特性 伪随机数列也称作PN码。它具有近似随机数列(噪声)的性质,它的相关函数接近白噪声的相关函数 (Δ函数 ),即有窄的高峰或宽的功率谱密度 ,使它易于从其他信号或干扰中分离出来。而又能按一定的规律(周期)产生和复制的序列。因为随机数列是只能产生而不能复制的,所以称其为“伪”随机数列。广泛应用于通信、雷达、导航等重要的技术领域。近年来 ,在自动控制、计算机、声学、光学测量、数字式跟踪和测距系统 ,以及数字网络系统的故障分析检测也得到广泛的应用。 伪随机数列具有这样的特点: (1)每个周期中,“1”码出现2n-1次,“0”码出现2n-1次,即0、1出现概率几乎相等。 (2)序列中连1的数目是n,连0的数目是n-1。 (3)分布无规律,具有与白噪声相似的伪随机特性。

随机数生成器

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

用C语言的rand()和srand()产生伪随机数的方法总结

标准库(被包含于中)提供两个帮助生成伪随机数的函数: 函数一: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<

C语言程序设计 伪随机数的产生

4.3.1伪随机数的产生 产生伪随机数的函数是rand(),该函数可随机生成0~RAND_MAX之间的一个整数。RAND_MAX是头文件中定义的一个符号常量。ANSI规定RAND_MAX的值不小于32767。 在编写程序时经常需要各种范围的随机数,如投骰子时需要的随机数是1~6,投一枚硬币会有正反面,需要的随机数是0~1。根据公式: n=a+rand()%b 可以得到所需范围内的随机数。其中,a为位移,是所需连续整数范围的第一个数,b是比例因子,是所需连续整数范围的宽度,则希望产生1~6之间随机数的公式为:face=1+rand()%6 【例4-3】编写一个模拟投掷硬币的程序,模拟20次,统计出正面出现的次数。 问题分析:每调用一次rand()函数会产生一个随机数,循环20次可以产生20个随机数。硬币有正反两面,用1代表正面,0代表反面,产生伪随机数的公式为rand()%2。 参考程序如下: /*程序名:4_3.c*/ /*功能:模拟投掷硬币20次,打印投掷结果并统计出正面出现的次数*/ #include #include int main() { int i,face,iCount=0; for(i=1;i<=20;i++) { face=rand()%2; printf("%5d",face); if(i%10==0)printf("\n"); if(face)iCount++; } printf("正面出现次数:%d次\n",iCount); return0; } 运行程序,结果为: 1100100000 1111111010 正面出现次数:11次 如果再次运行该程序,会发现结果与上面的相同。这怎么称得上是随机数呢?实际上,每次调用rand函数产生的一系列数似乎是随机的,但每次执行程序所产生的序列则是重复的。程序调试完成后,可以使用函数srand(),通过提供不同的种子产生不同的随机数序列。

随机数生成函数C

随机数生成函数srand() rand() 2007年12月11日星期二01:42 如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的,srand(n) for(10) rand() 也就是说,以一个固定的数值作为种子是一个缺点。通常的做法是以这样一句代码srand((unsigned) time(NULL));来取代,这样将使得种子为一个不固定的数,这样产生的随机数就不会每次执行都一样了。 1,先看一个例子 #include #include #include using namespace std; int main( void ) { int i; /* Seed the random-number generator with current time so that * the numbers will be different every time we run. */ srand( (unsigned)time( NULL ) ); /* Display 10 numbers. */ for( i = 0; i < 10;i++ ) printf( " %6d\n", rand() ); } 2.关于time.h time.h中包含很多有趣的函数,譬如 char *ctime(long *clock) 本函数把clock所指的时间(如由函数time返回的时间)转换成下列格式的 字符串:Mon Nov 21 11:31:54 1983\n\0 #i nclude #i nclude #i nclude using namespace std; void main() {

MATLAB伪随机数发生器

MATLAB伪随机数发生器.txt生活是过出来的,不是想出来的。放得下的是曾经,放不下的是记忆。无论我在哪里,我离你都只有一转身的距离。 均匀性较好的随机数生成 zz from https://www.sodocs.net/doc/b25825916.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-0:Microsoft VC++产生随机数的原理: Srand ( )和Rand( )函数。它本质上是利用线性同余法,y=ax+b(mod m)。其中a,b,m都是常数。因此rand的产生决定于x,x被称为Seed。Seed需要程序中设定,一般情况下取系统时间作为种子。它产生的随机数之间的相关性很小,取值范围是0—32767(int),即双字节(16位数),若用unsigned int 双字节是65535,四字节是4294967295,一般可以满足要求。 1-1:线性同余法: 其中M是模数,A是乘数,C是增量,为初始值,当C=0时,称此算法为乘同余法;若C ≠0,则称算法为混合同余法,当C取不为零的适当数值时,有一些优点,但优点并不突出,故常取C=0。模M大小是发生器周期长短的主要标志,常见有M为素数,取A为M的原根,则周期T=M-1。例如: a=1220703125 a=32719 (程序中用此组数) a=16807 代码: void main( ) { const int n=100; double a=32719,m=1,f[n+1],g[n],seed; m=pow(2,31); cout<<"设置m值为"<>seed; f[0]=seed; for(int i=1;i<=n;i++) //线性同余法生成随机数 { f[i]=fmod((a*f[i-1]),(m-1)); g[i-1]=f[i]/(m-1); cout.setf(ios::fixed);cout.precision(6); //设置输出精度 cout<

信息安全基础综合实验讲义(伪随机数产生器)-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的整数。此外,为了使得随机数列不易被重现,

随 机 数 生 成 器

使用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个不同的种子生成的随机数。

伪随机数产生器

伪随机数产生器 ----------------------------------------------------------------------------- -- -- The following information has been generated by Exemplar Logic and -- may be freely distributed and modified. -- -- Design name : pseudorandom -- -- Purpose : This design is a pseudorandom number generator. This design -- will generate an 8-bit random number using the polynomial p(x) = x + 1. -- This system has a seed generator and will generate 2**8 - 1 unique -- vectors in pseudorandom order. These vectors are stored in a ram which -- samples the random number every 32 clock cycles. This variance of a -- priority encoded seed plus a fixed sampling frequency provides a

truely -- random number. -- -- This design used VHDL-1993 methods for coding VHDL. -- ---------------------------------------------------------------------------- Library IEEE ; use IEEE.std_logic_1164.all ; use IEEE.std_logic_arith.all ; entity divide_by_n is generic (data_width : natural := 8 ); port ( data_in : in UNSIGNED(data_width - 1 downto 0) ; load : in std_logic ; clk : in std_logic ; reset : in std_logic ; divide : out std_logic ); end divide_by_n ;

伪随机数发生器

伪随机数发生器程序说明文档 ——《密码编码学与网络安全》实验六一、基本变量、数据结构、函数说明: 注意:基本变量、数据结构、函数说明和实验二DES算法是一样的。没有任何变化。 1.基本变量定义部分: flag:boolean型变量,用于标识是解密还是加密过程。 2.数据结构定义部分: DT64:int型一维数组,64位的随机时间串。 V64: int型一维数组,64位的种子值。 sum64:int型一维数组,用于存储模二加的中间结果。 R64:int型一维数组,用于存储64位伪随机数。 bytekey:byte型一维数组,用于存储密钥及其子密钥字节流信息。 IP:int型一维数组,静态,用于存储初始置换矩阵。 IP_1:int型一维数组,静态,用于存储初始置换矩阵的逆矩阵。 PC_1:int型一维数组,静态,用于存储置换选择矩阵1。 PC_2:int型一维数组,静态,用于存储置换选择矩阵2。 E:int型一维数组,静态,用于存储扩充置换矩阵。 P:int型一维数组,静态,用于置换函数矩阵。 S_Box:int型三维数组,静态,用于SBox矩阵设置。 LeftMove:int型一维数组,静态,用于设置左移位置列表。 keydata:int型一维数组,用于存储二进制加密密钥。 encryptdata:int型一维数组,用于存储二进制加密数据。 EncryptCode:byte型一维数组,用于存储加密操作完成后的字节数组。 KeyArray:int型二维数组,用于存储密钥初试化后的二维数组。 3.基本函数定义: UnitDes:初始化函数,用于将密钥初始化成字节型数组密钥。 KeyInitialize:用于初始化密钥,生成每一轮的子密钥。 Encrypt:每一轮的加密函数。 ReadDataToBirnaryIntArray:将数据转换为二进制数,存储到数组。 LeftBitMove:循环移位操作函数。 LoopF:落实到每一轮的具体操作函数。 GetEncryptResultOfByteArray:将存储64位二进制数据的数组中的数据转换为八个整数(byte)。 ByteDataFormat:字符串数组拼接函数。 DesEncrypt:具体的加、解密函数,由flag控制工作模式。

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实现

随机数生成器功能: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值

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实现 基于以上原理,下面用verilog产生一个n=8,反馈系数为 g0g1g2g3g4g5g6g7g8=101110001的伪随机数发生器,它共有2^8=255个状态,该LFSR 的结构如下: verilog源代码如下: moduleRanGen( inputrst_n, /*rst_n is necessary to prevet locking up*/ inputclk, /*clock signal*/ input load, /*load seed to rand_num,active high */ input [7:0] seed,

随 机 数 生 成 器

利用泊松分布实现随机数生成器 不多说,直接上代码,这是在华师大算法课上做的实验代码,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);

C语言如何产生随机数

C语言如何产生随机数 1. 基本函数 2. 使用方法 rand()函数返回0到RAND_MAX之间的伪随机数(pseudorandom)。RAND_MAX常量被定义在stdlib.h头文件中。其值等于32767,或者更大。 srand()函数使用自变量n作为种子,用来初始化随机数产生器。只要把相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。因此,我们可以把时间作为srand()函数的种子,就可以避免重复的发生。如果,调用rand()之前没有先调用srand(),就和事先调用srand(1)所产生的结果一样。 每次运行都将输出:1 7 4 0 9 4 8 8 2 4 每次运行都将输出:1 7 4 0 9 4 8 8 2 4 例2的输出结果与例1是完全一样的。

每次运行都将输出:4 0 1 3 5 3 7 7 1 5 该程序取得的随机值也是在[0,10)之间,与srand(1)所取得的值不同,但是每次运行程序的结果都相同。 该程序每次运行结果都不一样,因为每次启动程序的时间都不同。另外需要注意的是,使用time()函数前必须包含头文件time.h。 3. 注意事项 求一定范围内的随机数。 如要取[0,10)之间的随机整数,需将rand()的返回值与10求模。 那么,如果取的值不是从0开始呢?你只需要记住一个通用的公式。 要取[a,b)之间的随机整数(包括a,但不包括b),使用: (rand() % (b - a)) + a 伪随机浮点数。 要取得0~1之间的浮点数,可以用: rand() / (double)(RAND_MAX) 如果想取更大范围的随机浮点数,比如0~100,可以采用如下方法: rand() /((double)(RAND_MAX)/100) 其他情况,以此类推,这里不作详细说明。 当然,本文取伪随机浮点数的方法只是用来说明函数的使用办法,你可以采用更好的方法来实现。 举个例子,假设我们要取得0~10之间的随机整数(不含10本身): 大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解。 首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪

随机数生成器

湖北轻工职业技术学院 实验报告 题目:随机数生成器 专业:电子信息工程技术 姓名: 学号: 班级: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、企业要调查消费者对某产品的需求量,要从很多消费者中抽选一定数量的样本调查。

相关主题