随机数生成算法

chrome 有很多场景我们需要产生随机数。一般是采用线性同余法。

一。讲讲JAVA的Random函数吧。

Random在初始化时会产生一个种子。默认以seedUniquifier+System.nanoTime()作为种子。此后seedUniquifier会自增1.以便下一次Random时和这次不相同。seedUniquifier起初是一个常量。值为8682522807148012L.随机数产生过程为;

1。产生seend,根据系统时间.seed=++seedUniquifier + System.nanoTime(),seedUniquifier =8682522807148012L;

2.seed = (seed ^ multiplier) & mask;//multiplier = 0x5DEECE66DL;,mask = (1L << 48) - 1;

3.调用next方法可以生成一个随机数。先用上面的seed算出一个新的seed,如 nextseed = (oldseed * multiplier + addend) & mask;// addend = 0xBL;

4.(int)(nextseed >>> (48 - bits));//bits为需要产生的数的位数。如int型为32.

 

 

其实JAVA的Random随机数生成算法还是很弱的。属于线性适配随机发生器

二、Windows平台下随机数生成算法

首先建立一个动态数据缓冲池,缓冲池被释放之前,会不停的收集windows平台下众多的物理随机信息,包括:①当前进程的ID;②当前线程的ID;③系统引导以来的时钟数;④各种高精度的性能计数器;⑤用户环境模块的MD4(Message Digest 4,信息摘要4)散列,包括用户名,计算机名和搜索路径等;⑥高精度的内部CPU计算器,如RDISC,ROMSR,RDPM等;⑦底层系统信息,如空闲时间,内检时刻,中断时间,提交限定,页面计数,缓存计数,操作系统外部计数、键盘、鼠标信息等。

当程序需要随机数时,从这些缓冲池中读取这些物理信息,因为这些信息大部分均从物理量读取而来,所以有不可预测性,可以满足随机性的要求。

你可能感兴趣的:(随机数)