`

java 慎用 new Random()

阅读更多
package tt;

import java.util.*;
/**
* 首先看一下这个程序的工作原理:

通过这句命令首先得到的六个数是:

8 5 12 12 15 0

然后,通过new Random(-147909649).nextInt(27)得到的6个数是:

23 15 18 12 4 0

这样一来,根据:sb.append((char) (‘`’+n)); 得到:

8 + 96 = 104 --> h
5 + 96 = 101 --> e
12 + 96 = 108 --> l
12 + 96 = 108 --> l
15 + 96 = 111 --> o
23 + 96 = 119 --> w
15 + 96 = 111 --> o
18 + 96 = 114 --> r
12 + 96 = 108 --> l
4 + 96 = 100 --> d

整个程序的执行就是这样。

关于这个程序的运行原理的解释,最置顶的一个回复如下:

“如果java.util.Random是被一个具体的数字做为“随机数种子”而实例化(在本例中是-229985452和-147909649),
那么该实例就会以这个随机数种子作为随机算法产生随机数的基础。
* @author aircoder
*
*/
public class HelloWorld{

    public static String randomString(int i)
    {
        Random ran = new Random(i);
        StringBuilder sb = new StringBuilder();
        for (int n = 0; ; n++)
        {
            int k = ran.nextInt(27);
            if (k == 0)
                break;

            sb.append((char)('`' + k));
        }

        return sb.toString();
    }

    public static void main(String[] args){
        System.out.println(randomString(-229985452)+" "+randomString(-147909649)+"\t"+randomString(1));
 
    //   结果永远是  hello world xasxhmejajppj
        /**
         * 如果java.util.Random是被一个具体的数字做为“随机数种子”而实例化(在本例中是-229985452和-147909649),那么该实例就会以这个随机数种子作为随机算法产生随机数的基础。

使用同样的种子实例化的Random对象,每次运行时将会遵循同一种模式,产生同样的序列。”
这就是为什么每次运行该程序都会产生同样的结果的原理啦~
  Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New Random(),另外一个是New Random(Int32),前者是根据触发那刻的系统时间做为种子,来产生一个随机数字,后者可以自己设定触发的种子,一般都是用UnCheck((Int)DateTime.Now.Ticks)做为参数种子,因此如果计算机运行速度很快,如果触发Randm函数间隔时间很短,就有可能造成产生一样的随机数,因为伪随机的数字,
  在Random的内部产生机制中还是有一定规律的,并非是真正意义上的完全随机。
         */
   
    }

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics