听说java随机数是伪随机就是通过一个种子进行运算得出,既然这样那么应该可以通过随机数再次得到种子,通过种子再次得到接下来的所有随机数。
首先看下随机数的生成,随机数生成一个是带种子一个是不带种子,不带种子的默认用seedUniquifier() ^ System.nanoTime() 作为种子,seedUniquifier()是一个线性值可预测
唯一预测起来比较麻烦的是System.nanoTime() =23429979025971 类似于这样的一个电脑纳秒值,再加上cpu的运算几乎算是随机的了,如果是带种子的话那么随机数就可以预测了。
之前在网上找随机数逆向算法没找到所以就自己研究了下,现在写成文章以免日后自己忘记了可以通过文章快速上手,其次也给各位一个参考,代码未格式化和整理的第一手代码,如果整理了我怕我以后上手麻烦。什么线性同余算法什么梅森算法完全看不懂,就是按照一个随机数然后逆向算出种子然后在随机出接下来的随机数。
/**/
for (long i = 23429979025971L; i <= 23429979025971L; i++) {
Random random=new Random(i,i);
for (int j = 1; j <= 5; j++) {
Double d=random.nextDouble();
//if((d)==0.9943732600499389){
System.out.println(i+”->”+j+”->”+System.currentTimeMillis()+”->”+d);