随机数生成算法

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等;⑦底层系统信息,如空闲时间,内检时刻,中断时间,提交限定,页面计数,缓存计数,操作系统外部计数、键盘、鼠标信息等。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值