对java中random的思考
来源:互联网 发布:源码建站是什么 编辑:程序博客网 时间:2024/06/05 02:11
今天又一次去看jdk 7的api的random的时候,对random怎么实现的伪随机数很好奇,在百度中搜索了一下,然后得到了一些启示。
JDK 中有两个随机数类:
一个是 PRNG,也就伪随机数类 java.util.Random,是采用线性同余算法产生的。
另一个是 RNG,也就是 java.util.Random 的子类强随机数 java.security.SecureRandom,这是一个 SPI 类,也就是说具体的算法由 Provider 提供。Sun 给其提供了一个默认的算法——SHA1PRNG。
由于 Random 是采用时间作为随机数种子,如果 hacker 知道随机数产生的时间,那就能重现随机数。而 SecureRandom 属于强随机数,一般不单独采用时间作为随机数种子,还会采用临时文件夹中大小,某个线程从休眠到被唤醒所耗的时间等等一系列无法重现的值作为随机数种子。
SecureRandom 一般用于安全、加密 API,以及 UUID 的生成。
但是什么是线性同余算法以及random怎么实现的random呢?
线性同余方法(LCG)是个产生伪随机数的方法。
它是根据递归公式:
- 也可以不加B。
其中是产生器设定的常数。
LCG的周期最大为,但大部分情况都会少于M。要令LCG达到最大周期,应符合以下条件:
- 互质;
- 的所有质因子的积能整除;
- 若是4的倍数,也是;
- 都比小;
- 是正整数。
线性同余算法有m 、a 、c 和X0 4个参数,通过置Xn + 1 ≡aXn + c (mod m) ,求得随机数序列< Xn > , 这个序列称作线性同余序列。m、a 、c 和X0 分别称做模数、乘数、增量和初始值。线性同余方法速度快,如果对乘数和模数进行适当的选择,可以满足用于评价一个随机数产生器的3 种准则:
1.这个函数应该是一个完整周期的产生函数。也就是说,这个函数应该在重复之前产生出0 到m之间的所有数;
2.产生的序列应该看起来是随机的;
3.这个函数应该用32bit 算术高效实现。
例如在我的算法中,a=7^5;c=0;m=2^31-1; x0为系统时间,但是系统时间,不是很安全,可以增加其他的变量来使这个值更加安全。
- 对java中random的思考
- 对 Java 中 clone 方法的思考
- 对Java中递归的再思考
- java中Random的用法
- 对《JAVA编程思想》中一段代码的思考
- 我对JAVA中一个多线程程序的思考
- Java中对变量范围转换引发的思考
- java中Math.random()与java.util.random()的区别
- java中Math.random()与java.util.random()的区别
- JAVA中Random类的Random r=new Random()和Random r=new Random(seedValue)的区别
- 对思考的思考
- Java中Random的简单使用说明
- Java中Random函数的总结
- java中 Random类的用法
- java中Random类的使用
- Java中Random自定义的枚举类型
- Java中Random类的应用问题
- 对silverlight中DoubleAnimation的思考
- java 数字处理与位运算
- 第12章-图形用户接口
- Spring 系列: Spring 框架简介
- 黑马程序员——java基础之语法(二)
- Visual Studio 2012 中的一些小技巧
- 对java中random的思考
- 说起人生,我们需要的是选择和沉淀
- Android异步加载获取网络数据(图片)
- IOS 添加事件
- 转:raw_input()和input()的区别
- 关于SQLServer的混合模式(Windows 身份验证和 SQL Server 身份验证)
- rtp与rtcp协议详解
- 打开布局文件忽然报错:Incorrect line ending: found carriage return (\r) without corresponding newline (\n):
- SAT数学真题一