伪随机探究
随机数发生器
我们很多的算法中需要随机数,因此必须有一种方法来产生它。同时我们也了解计算机的随机算法是一种伪随机。提前生成好随机序列,根据不同的随机种子函数,生成不同的随机数。
产生随机数最简单的方法就是线性同余数发生器。它于1951年有lehmer首先提出,对于一个Xi满足
X(i+1)=AXimodM;
为了开始这个序列,必须给Xi一个初值,这个值就叫种子(seed)。
人们可能会想到要假设所有的机器在它们标准的库中都有一个至少像不溢出随机数生成器的程序,但很遗憾,情况并非如此。许多库中的发生器基于函数
Xi+1=(Axi+C)mod2^B;
其中B的选取要匹配机器整数的比特位数,而C是奇数。事实上,其他随机数发生器要比不溢出随机数生成器所提供的随机数发生器的循环(周期)小得多。这些发生器对于需要长的随机数序列的情况是不合适的。Java库和UNIX的 drand48 函数使用这种形式一个发生器。不过,它们使用48比特线性同余发生器并且只返回高32比特位,这样,避免了在低阶比特位上的循环问题。
其中用到的常数是A=25 214 903917,B=48以及C=11.
因为Java提供64比特的long型整数,所以用标准 Java实现一个基本的48比特随机数发生器用一页代码就可以展示。它比31比特随机数发生器略慢一点,但慢得不多,却得到了一
个明显长得多的周期。