伪随机数生成器ppt课件
- 格式:ppt
- 大小:2.53 MB
- 文档页数:5
伪随机数法一、什么是伪随机数法?伪随机数法(Pseudo Random Number Generator, PRNG)是一种通过计算机算法生成的数字序列,看起来像是随机的,但实际上是有规律的。
这种方法可以用于模拟随机事件,例如在游戏中模拟掷骰子或抽奖等。
二、PRNG的原理PRNG的原理基于一个起始值称为“种子”,通过一定的算法对种子进行运算得到下一个数字。
这个过程不断重复,每次都以前一个数字作为输入,输出下一个数字。
由于计算机算法具有确定性,所以PRNG生成的数字序列虽然看起来像是随机的,但实际上是可预测的。
三、PRNG与真随机数与PRNG相对应的是真随机数发生器(True Random Number Generator, TRNG)。
TRNG通过物理过程如放射性衰变或热噪声等方式产生真正意义上的随机数。
相比之下,PRNG生成的数字序列虽然看起来像是随机的,但实际上存在规律可循。
四、常见PRNG算法1. 线性同余发生器(Linear Congruential Generator, LCG)LCG是最早也是最简单的PRNG算法之一。
它基于以下公式:Xn+1 = (aXn + c) mod m其中,Xn为当前数字,a为乘数,c为增量,m为模数。
LCG的随机性基于选择合适的参数a、c、m以及种子值。
2. 梅森旋转算法(Mersenne Twister, MT)MT是一种高质量的PRNG算法,它可以产生高质量的随机数字序列。
MT算法基于一个大质数2^19937-1,并且具有良好的统计特性。
3. 伽罗瓦LFSR算法(Galois Linear Feedback Shift Register, GLFSR)GLFSR是一种基于移位寄存器的PRNG算法。
它通过一个二进制序列和一个伽罗瓦域上的加法运算来生成随机数字序列。
五、PRNG应用场景PRNG广泛应用于模拟随机事件的场景中,例如游戏中的掷骰子或抽奖等。
此外,在密码学中也会使用PRNG生成密钥或加密数据。
伪随机数生成器系统熵什么是伪随机数生成器?伪随机数生成器(Pseudo Random Number Generator, PRNG)是一种算法或设备,通过一系列的计算步骤生成看似随机的数值序列。
与真随机数生成器(True Random Number Generator, TRNG)不同,伪随机数生成器是基于确定性的算法生成的,因此所获得的随机数实际上是可以重复的(在给定相同种子的情况下)。
尽管伪随机数生成器的输出序列在实际应用中足够随机,但它们并不是真正的“随机”。
伪随机数生成器的原理伪随机数生成器通常基于数学算法,如线性同余法或补码运算等。
这些算法利用初始种子(seed)作为输入,然后通过一系列复杂的计算步骤,生成随机的数字序列。
这个序列可以作为随机数在各种应用中使用,例如模拟实验、加密、统计分析等。
伪随机数生成器的关键问题是如何在存在确定性算法的情况下,生成看似随机的数字序列。
为了达到这个目标,伪随机数生成器通常使用一个大的周期(Period),即在输出序列中循环重复的次数非常大。
这样,在给定初始种子的情况下,每次使用伪随机数生成器所生成的数值序列都会是看似随机的,从而满足实际应用的需求。
然而,由于伪随机数生成器是基于确定性算法,它们的输出序列实际上是可以被预测的。
只要知道生成算法和初始种子,就可以重复生成相同的随机数序列。
因此,在一些应用中,特别是需要高度安全性和随机性的领域(如密码学),伪随机数生成器并不适用。
系统熵与伪随机数生成器在伪随机数生成器中,系统熵(Entropy)是一个重要概念。
系统熵可以看作是伪随机数生成器输出序列的随机性度量,即衡量其接近真随机序列的程度。
系统熵通常用比特(bit)表示,即一个序列可以有多少位被称为“真随机”。
系统熵的计算是通过考察输出序列中的统计特征来实现的。
比如,伪随机数生成器生成的随机序列在理想情况下应具有均匀的分布、独立性和长周期性。
如果输出序列具备这些特征,那么它越接近真随机序列,系统熵就越高。
【基础】伪随机数⽣成器mt19937使⽤⽅法使⽤下列代码定义⼀个以seed为伪随机数种⼦的uint32范围内的伪随机数⽣成器:mt19937 rnd(seed);定义完成后,使⽤下列代码⽣成若⼲个uint32范围内的伪随机数,并将其赋值给uint32类型变量r0, r1, r2, r3,它们极⼤概率互不相同:mt19937 rnd(time(nullptr));void randTest() {uint32_t r0 = rnd();uint32_t r1 = rnd();uint32_t r2 = rnd();uint32_t r3 = rnd();D1(r0); //r0 = 1890107454D1(r1); //r1 = 1903163696D1(r2); //r2 = 1307137696D1(r3); //r3 = 1016102494}同理,使⽤下列代码测试64位版本的伪随机数⽣成器:mt19937_64 rnd(time(nullptr));void randTest() {uint64_t r0 = rnd();uint64_t r1 = rnd();uint64_t r2 = rnd();uint64_t r3 = rnd();D1(r0); //r0 = 16757819831475078962D1(r1); //r1 = 10644585941176734154D1(r2); //r2 = 14550312371103145914D1(r3); //r3 = 16538001574918540854}更强的伪随机数种⼦有些很⽆聊的⼈会喜欢uphack使⽤time(nullptr)的代码,所以可以使⽤chrono::system_clock::now().time_since_epoch().count()来代替time(nullptr)。
在本地调试时,常常希望复现某个出错的情形,所以使⽤下⾯的条件编译进⾏控制:#define TIME chrono::system_clock::now().time_since_epoch().count()#ifdef LOCALint rnd_seed = 19937;#elseint rnd_seed = TIME;#endif // LOCALmt19937 rnd(rnd_seed);⽣成 [L,R] 范围内的随机整数转换成double类型后舍⼊到最近的整数。