文档库 最新最全的文档下载
当前位置:文档库 › 线性移位寄存器实现产生伪随机数M序列

线性移位寄存器实现产生伪随机数M序列

线性移位寄存器实现产生伪随机数M序列
线性移位寄存器实现产生伪随机数M序列

线性反馈移位寄存器实现产生伪随机数M序列

-----在CN03平台上,主要体现为Random功能的实现。

什么是线性反馈移位寄存器?

数学解释这里就不作介绍了,这里我们主要理解两个词语就行,一个是线性,它是指量与量之间的一种按比例、成直线的关系。这里面有一点点的数学知识,就是说在ai∈(0,1)的存储单元,ai的个数表示为反馈移位寄存器的级,在某一个时刻,这些寄存器会有一个状态,共有2^n个状态,每个状态对应于域GF(2)上的一个N维向量,用(a1,a2,a3,……an)表示。作为某一个时刻的状态,可以用一个函数f(a1,a2,a3…..an)来表示,从而称为该反馈寄存器的反馈函数,因此线性的意思,就是指如果这个反馈函数是a1,a2,a3….an的线性函数,那么这个反馈移位寄存器,就叫做线性反馈移位寄存器,比如f(a1,a2,a3,…an)=kna1⊕kn-1a2⊕….⊕k2an-1⊕k1an,其中系数ki∈{0,1}i=(1,2,3,…,n)。

另外一个词,就是反馈,这个词在我理解,就是说需要获得下一个状态就需要通过获得一个反馈值来实现。这个反馈的值可以在接下来的两种实现LFSR的方式的解释过程中得到更深刻的理解。

为什么要使用线性反馈移位寄存器?

使用线性反馈移位寄存器的作用:

在很多领域上都有使用到LFSR,譬如说密码学、白噪声,还有我们这里的随机功能实现,之所以把它使用到我们的radio的随机功能里面,除了它可以产生伪随机数序列实现随机播放功能之外,更重要的是我们利用了它的两个特点。其

一,只需要在代码中开辟几个byte的位置,就能够实现随机序列的产生,需要的空间很少。其二,是它的记忆功能,我们在随机的功能里面,选择了下一曲,则上一曲可以通过调整抽头数的序列来从新获得,而不需要开辟空间进行存储。怎样产生伪随机数M序列?

M序列的意思就是最大序列,专业点来说就是周期,就是这些不同的伪随机数在什么时候才会回到初始的输入状态,M序列的最大值为2^n-1,因为全0的初始状态不起作用,所以不能以全0的状态作为初始输入。

M序列就是我们在随机功能中获得的那个随机播放的序列。

它有些很好的特性:

1、通过反馈抽头数可以获得与之前输出的值的输入值,这也是我们所说的记

忆功能。

2、这些给定的反馈抽头数永远都是偶数的,而且只包括最高位,不包括最低

位。

3、还有另外一些特征,这里就不一一列出(这些规律的东西,我们只需要理解

我们用到的)。

两种LFSR的产生形式

这里有两种LFSR的实现方式,伽罗瓦(Galois)和斐波那契(Fibonacci)两种形式,也有人称为外部(External)执行方式和内部(Internal)执行方式。所以这两种方式也是有着本质的区别的。

1、伽罗瓦方式(Internal)

如下图

(Galois Implementation)

从图中我们可以看到Galois方式的一些特征,其中包括数据的方向从左至右而反馈线路则是由右至左的。其中X^0项(本原多项式里面的”1”这一项),作为起始项。按照本原多项式所指示的,确定异或门(XOR)在移位寄存器电路上的位置。如上图中的X^4.因此Galois方式也有人称它为线内或模类型(M-型)LFSR.

2、斐波那契方式(External)

如下图

(Fibonacci implementation)

从图中我们可以看到Fibonacci方式的数学流向和反馈形式是恰好跟Galois方式相反的,按照本原多项式,其中的X^0这一项则作为最后一项,这里只需要一个XOR门,将本原多项式中所给出的taps来设定它的异或方式。因此Fibonacci 方式也被叫做线外或者简型(S-型)LFSR.

代码是怎么通过这个原来实现伪随机数M序列的产生过程的?

下面来分析一下CN03的随机功能代码实现的过程:

对于Random_mode.c

1、Random_Initialise(void)

这里并不涉及到LFSR部分,其中最重要的是理解seed,就是随机数的种子,它是通过SYS_TICK_VALUE来获得的,也就是说,在系统运行的到某某时刻的时候,如果接到产生随机序列的命令,则获取当前的系统时刻作为seed,这里具有一定的随机性。

获得了随机的seed之后,我们看到它调用了InitialiseBitSwap(seed)。

2、InitialiseBitSwap(unsigned int Seed)

void InitialiseBitSwap(unsigned int Seed)

{ …….

for(…)//先活动一个初始数组,简单的赋值过程

last_bit_swap_array[BitSwapCounter] = bit_swap_array[BitSwapCounter]; …….

while(!LFSR_BitSwap)

{ if(Seed) //在确保LFSR的初始输入是随机数的同时,也要确保它不为0

{ //初始状态为0的时候,整个线性反馈移位的过程无论怎么操作都只有全0的状态

LFSR_BitSwap = Seed & 0x1F;

Seed = Seed >> 1;

}

else

{

LFSR_BitSwap = 1;

}

}

for(….)

{ do

{

if(LFSR_BitSwap & BIT_0)//这个条件是加速处理过程,对奇、偶数分开处//理,也能够增加序列的随机性

{ LFSR_BitSwap = (LFSR_BitSwap >> 1) ^

FIVE_STATE_NEXT_LFSR_FEEDBACK_TAPS;

//这句代码是整个程序里面最为重要的已经代码,它体现了Galois方式的代码实//现过程,跟进所提供的taps,我们可以把这句代码理解为in-line的处理过程,//先移位,然后跟进给出的taps对相应的为进行异或运算,从而实现了线性反馈//移位的功能。通过对照上图,能够较好地理解这个过程。

}

else

{ LFSR_BitSwap = (LFSR_BitSwap >> 1);

}

}while(LFSR_BitSwap > NUMBER_OF_LFSR_BITS);//确保这个随机数不能够大于确定的数组的个数值

bit_swap_array[last_bit_swap_array[BitSwapCounter]] = (LFSR_BitSwap-1); //获得这个随机数后,将它存到相应的数组里面

}

}

4、BitSwap(unsigned int InputValue)

还没有很好地理解这个函数的用意,但是我尝试去屏蔽关于这个函数的调用,并没有影响整个的随机功能。所以,我认为它应该也是一个增加随机性的过程。不过还好进一步理解,有新的进展,会更新到这里。

5、Random_PreviousTrack和Random_NextTrack

这两个函数就是产生最后的随机播放曲目的应用。里面的核心代码在第二点里面已经基本上解释完毕,可以参考第二个函数的解释。至于上一曲下一曲的区别,这里要重点说明一下,就是利用了反馈抽头数在M序列上面的应用,在M序列

解释的第一个特点中有提及。我们可以看看在头文件random.h里面的定义:

#define SIXTEEN_STAGE_NEXT_LFSR_FEEDBACK_TAPS (BIT_15 | BIT_13 | BIT_12 | BIT_10 )

#define SIXTEEN_STAGE_PREV_LFSR_FEEDBACK_TAPS (BIT_0 | BIT_14 | BIT_13 | BIT_11 )

抽头数的定义有一定的规律,参照这个规律,可以实现对其他级的选择。

小结

小结一下这个学习的过程,里面还有两点没有深入地理解:

1、抽头数是怎么来的,通常已经算好了,网上有相关的资源。参考网站:https://www.wendangku.net/doc/2e7147275.html,/resources/articles/m_sequence_linear_fe edback_shift_register_lfsr.htm

但是其中的数学知识是怎么实现的,在此就不作介绍了,可以网上收索一些资源。

2、在上面也听过,有些函数可能是为了增加伪随机数的随机性而设置的,但是现在还不确定,譬如,BitSwap函数,还需要进一步学习。

随机数生成算法的研究

随机数生成算法的研究 [日期:2006-05-23] 来源:作者:[字体:大中小] 张敬新 摘要:本文通过流程图和实际例程,较详细地阐述了随机数生成的算法和具体的程序设计,分析了其符合算法特征的特性。 关键词:随机数;算法;算法特征;程序设计 1 引言 在数据结构、算法分析与设计、科学模拟等方面都需要用到随机数。由于在数学上,整数是离散型的,实数是连续型的,而在某一具体的工程技术应用中,可能还有数据值的范围性和是否可重复性的要求。因此,我们就整数随机数和实数随机数,以及它们的数据值的范围性和是否可重复性,分别对其算法加以分析和设计。以下以Visual Basic 语言为工具,对整数随机数生成问题加以阐述,而对于实数随机数生成问题,只要稍加修改就可转化为整数随机数生成问题。 根据整数随机数范围性和是否可重复性,可分为: (1)某范围内可重复。 (2)某范围内不可重复。 (3)枚举可重复。 (4)枚举不可重复。 所谓范围,是指在两个数n1和n2之间。例如,在100和200之间这个范围,那么,只要产生的整数随机数n满足100≤n≤200,都符合要求。所谓枚举,是指有限的、已知的、若干个不连续的整数。例如,34、20、123、5、800这5个整数就是一种枚举数,也就是单独可以一个个确定下来。 2 某范围内可重复 在Visual Basic 语言中,有一个随机数函数Rnd。 语法:Rnd[(number)]。 参数number 可选,number 的值决定了Rnd 生成随机数的方式。Rnd 函数返回小于1 但大于或等于0 的值。

在调用Rnd 之前,先使用无参数的Randomize 语句初始化随机数生成器,该生成器具有一个基于系统计时器的种子。 若要生成某给定范围内的随机整数,可使用以下公式: Int((upperbound - lowerbound + 1) * Rnd + lowerbound) 这里,upperbound 是此范围的上限,而lowerbound 是范围的下限。 程序流程图: 程序例程:下面是一个生成10个10~20之间随机数的例子。 运行结果:12 10 20 20 17 17 18 14 12 20 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.wendangku.net/doc/2e7147275.html,/eda/edasrc/6153.html

随机数生成器

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

MATLAB随机数生成

2009年03月20日星期五 03:25 P.M. rand(n):生成0到1之间的n阶随机数方阵 rand(m,n):生成0到1之间的m×n 的随机数矩阵 (现成的函数) 另外: Matlab随机数生成函数 betarnd 贝塔分布的随机数生成器 binornd 二项分布的随机数生成器 chi2rnd 卡方分布的随机数生成器 exprnd 指数分布的随机数生成器 frnd f分布的随机数生成器 gamrnd 伽玛分布的随机数生成器 geornd 几何分布的随机数生成器 hygernd 超几何分布的随机数生成器 lognrnd 对数正态分布的随机数生成器 nbinrnd 负二项分布的随机数生成器 ncfrnd 非中心f分布的随机数生成器 nctrnd 非中心t分布的随机数生成器 ncx2rnd 非中心卡方分布的随机数生成器 normrnd 正态(高斯)分布的随机数生成器 poissrnd 泊松分布的随机数生成器 raylrnd 瑞利分布的随机数生成器 trnd 学生氏t分布的随机数生成器 unidrnd 离散均匀分布的随机数生成器 unifrnd 连续均匀分布的随机数生成器 weibrnd 威布尔分布的随机数生成器 (From:https://www.wendangku.net/doc/2e7147275.html,/question/30033707.html) matlab生成随机数据 matlab本身提供很多的函数来生成各种各样的随机数据: normrnd 可以生成一定均值和标准差的正态分布 gamrnd 可以生成gamma分布的伪随机数矩阵 chi2rnd 可以生成卡方分布的伪随机数矩阵 trnd 可以生成t分布的伪随机数矩阵 frnd 可以生成f分布的伪随机数矩阵 raylrnd 可以生成rayleigh分布的伪随机数矩阵

伪随机数列发生器-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)分布无规律,具有与白噪声相似的伪随机特性。

随机数生成方法

University of Sydney School of Information Technologies Generating Random Variables Pseudo-Random Numbers Definition : A sequence of pseudo-random numbers ()i U is a deterministic sequence of numbers in []1,0 having the same relevant statistical properties as a sequence of random numbers. The most widely used method of generating pseudo-random numbers are the congruential generators: ()M X U M c aX X i i i i =+=?mod 1 for a multiplier a , shift c , and modulus M , all integers. The sequence is clearly periodic, with maximum period M . The values of a and c must be carefully chosen to maximise the period of the generator, and to ensure that the generator has good statistical properties. Some examples: M a c 259 1313 0 232 69069 1 231-1 630360016 0 232 2147001325 715136305 Reference: Ripley, Stochastic Simulation , Chapter 2

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(),通过提供不同的种子产生不同的随机数序列。

随 机 数 生 成 器

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

MATLAB伪随机数发生器

MATLAB伪随机数发生器.txt生活是过出来的,不是想出来的。放得下的是曾经,放不下的是记忆。无论我在哪里,我离你都只有一转身的距离。 均匀性较好的随机数生成 zz from https://www.wendangku.net/doc/2e7147275.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的差异性尤为严重。

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

用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<

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

伪随机数产生器

伪随机数产生器 ----------------------------------------------------------------------------- -- -- 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.随机数的产生,2.确定随机数的上下限,3.将产生的随机数用16进制的ASCII 表示出来,本程序主要有四大模块,1.随机数产生模块;2.数制转换模块;3.字符显示模块;4.运算模块,通过这次汇编语言的程序设计,让我们更加了解了汇编语言,扩展了我们在汇编邻域的知识,让我们掌握了编写实训报告的能力,汇编语言的长处在于编写高效且简单,易懂,需要对机器硬件精确控制的程序。汇编语言比机器语言易于读写、调试和修改,同时具有机器语言全部优点。本次编写的随机数产生器简单易懂,其中的上下线用编写者定义,更加的具有灵活性,此程序突出了汇编语言的简单,灵活,易读写,易修改的特点。 关键词:汇编语言;程序;随机数

目录 1 设计任务 (1) 2任务分析 (2) 2.1 程序功能说明 (2) 2.2 程序要点说明 (2) 3功能及程序设计 (3) 3.1主程序流程图及结构图 (3) 3.2程序说明 (4) 3.3 子程序功能说明 (5) 3.3.1 MACT子程序说明 (5) 3.3.2 RAND子程序说明 (7) 3.3.3 字符串显示子程序说明 (8) 4调试结果及分析 (10) 5心得体会 (12) 6参考文献 (13) 附录: (14) 源代码 (14)

1 设计任务 产生十六进制随机数并对其进行运算是相当多应用程序经常会涉及到的一种功能。实际上,十六进制数有个计数符号:0~9,A~F。4个二进制位共有16种组合状态,这样每个十六进制数的计数符号可对应4位二进制数的一种组合状态;反之,1个十六进制符号可以替代一种4位二进制数的组合状态。在阅读和编写汇编语言程序时,经常用十六进制数表示数据、存储单元地址或代码等。 本次课程设计研究的产生16进制随机数并运算的内容。本程序采用汇编语言编程,建立一个文件,显示任意两个16进制数的加法或减法表达式及其运算结果。在减法运算中,如果被减数小于减数,显示“Divider error”的提示信息。

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);

随机数生成器

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

相关文档