rambo

随机数发生器


1、什么是随机数发生器?

定义:一个随机数发生器就是一个产生数据流的设备,数据流中的每一位都是不可预测,偶然的。但是从一定长度的数据流来看,它又符合某种分布。

  • 随机程度:通常在产生的一系列声称是随机的数值时,我们关心的是这些数值在某种统计意义上是随机的。即均匀分布和独立性。
  • 不可预测程度:对于“真正的”随机序列,每个数与序列中的其他数都是统计独立的,因此不可预测。然而,实际上我们很少能使用到真正的随机数;相反我们用到的都是由某种算法生成的。这个时候,我们得防止攻击者从序列前边的元素预测出将来的元素。

2、 随机数发生器的分类

一般来说,随机数发生器有三种,它们分别是真随机数发生器(TRNG,True Random Number Generator)、伪随机数发生器(PRNG,Pseudo Random Number Generator)和密码学安全随机数发生器(CSPRNG,Cryptographically Secure Pseudo Random Number Generator)。

本文介绍的LFSR(Linear Feedback Shift Register)实际上是PRNG。首先,移位寄存器包括两个部分:1)级,每一级包含一个比特,比如11010110是一个8级的移位寄存器产生的  2)反馈函数,线性反馈移位寄存器的反馈函数是线性的,非线性反馈移位寄存器的反馈函数是非线性的。先来看一个例子:lfsr1

一个n级的移位寄存器产生的序列的最大周期为2^{n}-1,当然这个最大周期跟反馈函数有很大关系,线性反馈函数实际上就是这个n级的移位寄存器选取“某些位”进行异或后得到的结果,得到线性反馈函数之后,把这个移位寄存器的每次向右移动一位,把最右端的作为输出,把“某些位”的异或结果作为输入放到最左端的那位,这样所有的输出对应一个序列,这个序列叫做M序列,是最长线性移位寄存器序列的简称。理论表明,要使LFSR得到最长的周期,这个抽头序列构成的多项式加1必须是一个本原多项式(即不可约)。

lfsrresult

可以看到周期为FFFF,即2^{16}-1,说明该随机数发生器有很好的随机性。这个随机数可以用来对scrambled后的control data 进行descramble。

扩展:在百度或者Google这样的搜索引擎中,爬虫要对爬取的网页进行判重,这个是通过信息指纹来实现的。具体来说就是把每一个网址随机地映射到128位二进制,这样每一个网址只占用16个字节的空间,这个128位的随机数就是这个网址的信息指纹,可以证明,只要产生的随机数足够好,那么就可以保证几乎不可能有两个网址的信息指纹相同,就如同不可能有两个人的指纹相同一样,而梅森旋转算法是产生高质量伪随机数的算法。《数学之美》

对于随机数生成器写成容器加算法的形式:

容器:

迭代器:

区别操作符的前缀和后缀形式:

问题:他们的形参数目和类型相同,普通重载不能区别所定义的是前缀操作符还是后缀操作符。

为了解决这一问题,后缀式操作符函数接受一个额外的int型参数。使用后缀操作符时,编译器提供0作为这个形参的实数。为了与内置操作符一致,后缀式操作符应咖灰旧值(尚未自增或自减),并且应作为值返回,而不是引用返回。