本文主要介绍java里的一些随机函数实现与用法,也会附带介绍一些随机数知识。
目前计算机实现的随机函数过程中,都是伪随机的,不过,可以实现统计学意义上的随机。比如手机鼠标移动位置,点击,系统的参数等等作为种子,这种随机统计上看起来就是“真随机数”了,具有较高的安全性。当然对于多线程,仍然需要做一些讨论。
关键字:随机数,java,伪随机数,种子, SecureRandom
1、分类
随机数被准确地分成了三类:真随机数、准随机数、伪随机数。那么这三种的区别是什么呢?书上的定义:
1)真随机数 :产生的数不可预计,也不可能重复产生两个相同的真随机数序列。真随机数只能通过某些随机的物理过程来产生,如放射性衰变、电子设备的热噪声等。java里将一些不可测的因素引入,收集计算机的各种信息,如键盘输入时间,CPU时钟,内存使用状态,硬盘空闲空间,IO延时,进程数量,线程数量等信息,来得到一个近似随机的种子。我们暂且将这种随机数称为真随机。比如linux里的/dev/random(会产生阻塞)与/dev/urandom(不会产生阻塞)
2)准随机数:其随机数序列不具备随机性质,仅仅是用它来处理问题能够得到正确的结果。分布相对于伪随机数更为均匀。(参考本文底部 [2],[3])
3)伪随机数:通过某种数学公式或者算法产生的数值序列。虽然在数学意义上伪随机数是不随机的,但是如果能够通过统计检验,可以当成真随机数使用。
本文讨论的都是伪随机数和真随机数。伪随机数生成器被称为PRNG(Pseudo-random number generato