伪随机数算法

计算机不可能产生真正的随机数,所有的随机数都是伪随机数,通过算法实现,随机表示的是产生的数据符合一定的分布,在统计意义上是随机的,如果知道原理那么就能预测。

unix产生随机数

unix内核中的随机数发生器:

  • 通过收集非确定性的设备事件来作为随机种子产生随机数;
    • 比如说,鼠标的点击事件等;
  • 收集设备事件的机制被称作“熵池”;

    线性同余

    递推公式:
    random库 - 图1
    其中:random库 - 图2为常数
    特点:

  • 产生的随机数符合均匀分布;

    • 如果周期为M,那么random库 - 图3的数字,依次取一次,也即是说每个数字的出现概率相同;
  • 随机数周期小于等于random库 - 图4

如果要想LCG周期最大(达到M):

  1. random库 - 图5互质;
  2. M所有质因数的积能整除A-1;(存在情况,分解过程中,可能存在多个相同质因子,此处只取一个)
  3. 如果M为4的倍数,那么A-1同样如此;
  4. random库 - 图6(种子)都小于M;
  5. random库 - 图7为正整数;

    平方取中

    思想:
    将一个数(有m位)平方之后,最高为补0到2m位,然后选取中间的m位作为随机数,并以此位产生下一位随机数。
    random库 - 图8
  • 原数为m位,那么random库 - 图9将会是m+1位,所以random库 - 图10驱魔最终的结果函数被限定在m位;

    梅森旋转算法

    梅森数

    形如random库 - 图11的素数成为梅森数;

    线性反馈移位寄存器

    该电路有n级触发器和一些异或门组成;
    抽头:影响下一个状态的比特位叫做抽头;(下图中的4和3位为抽头)
    反馈多项式M(x):由抽头决定,比如下图中的为random库 - 图12
    要想得到最大周期:反馈多项式是一个本原多项式;

    • 本原多项式:不能因式分解

random库 - 图13
算法特点:

  • 利用线性反馈移位寄存器实现随机数生成;

    python random库

    随机种子

    1. random.seed(num)
    随机种子即是导入算法的初始值。设置随机种子,在后续过程中采用同样的随机种子可以复现原来的随机数。

    随机采样产生不重复随机数

    1. import random
    2. # 生成5个随机整数,范围为1-10
    3. num_list = random.sample(range(1,10),5)