随机数在咱们平常是一个很是经常使用的东西,不管数据加密仍是摇骰子,目的都是要结果不可肯定,不管什么结果都存在必定的几率。可是在咱们的计算机中随机数究竟是怎么产生的?java
大部分程序和编程语言确实产生的随机数都是伪随机数,好比像C语言,经常采用线性同余或者经过一个种子产生的伪随机数字,都是存在必定的规律可循。像咱们经常使用的高级编程语言java也是相似。例如java中获取整数某个范围内的数字源码:编程
final int internalNextInt(int origin, int bound) { if (origin < bound) { int n = bound - origin; if (n > 0) { return nextInt(n) + origin; } else { // range not representable as int int r; do { r = nextInt(); } while (r < origin || r >= bound); return r; } } else { return nextInt(); } }
这也就证实了若是知道了这些种子,或者根据已经产生的随机数字,就可以预测下一个可能产生的数字。微信
说到这里,咱们反过来想想,真正的随机数真的不存在吗?像银行就常常提示你们密码不要用本身的生日,身份证号中某几位数字或者本身的手机号,由于这样随时可能存在被破解的可能,咱们要尽可能使用一些随机数字,好比说某个路口,在第一分钟走了几我的做为你密码的第一位,而后依次排列,这个数字就是随机的。一样咱们的计算机若是单纯依赖于程序,可能就不存在真正的随机数,若是把计算机软件和外部硬件结合起来。好比说收集CPU天天转速以及温度,甚至某我的敲打键盘的频率,磁盘写入速度,等等信号。这样也就产生了“纯粹“的随机数。 unix操做系统也就存在一个熵池,经过熵池来收集一些随机值,这样也就产生了真正意义上的随机数字。编程语言
若有问题请微信扫码回复 加密