main 函数里这么写:
int k=0;
int count=0;
for (int i=0;i<30000;i++){  Random rd=new Random();
  k=rd.nextInt(3);
  if (k==2)  count++;}
out.print(count);或者:int k=0;
int count=0;
Random rd=new Random();
for (int i=0;i<30000;i++){  
  k=rd.nextInt(3);
  if (k==2)  count++;}
out.print(count);这两种写法第一种会得到毫无规律的结果,第二种则比较稳定
谁能告诉我原因?

解决方案 »

  1.   

    弄清楚Random的含义是最重要的,
    java这点不爽,面向对象都不是什么时候都是必要的,new什么的。
      

  2.   

    就是想问问random的机制阿
    哪位兄台有过这样的类似情况阿??
      

  3.   

    应该是第二种得到的真正的随机数吧java取随机数其实比vc要进步一点。所有取随机数的方式都有一个seed来决定,Random的默认构造函数里面seed取的是当前时间。你的for循环不会延迟,那么每次循环基本上System.currenttime都是一个数值,这样每次构造Random的时候实际上采用的seed相同。(这样说就应该明白你的两种方式实际上seed设置都是相同的)但java里面对随机数又多了一个判断,就是每次取随机数的位置要不同,这样即便同一个seed两次取数值也不会相同。这也就是说为什么第二种方法可以取得真正的随机数。但第一种方法每次都重新new一个Random,那么每次都会从同一个位置取随机值,而Seed又相同,当然取得的随机数不正确了。
      

  4.   

    第一种方法是在每一次循环都new了一次,所以会随机取值.
    第二种方法只是new了一次,然后就根据一个48位的给定种子随机生成值
      

  5.   

    学习一下,不过肯定第一种的随机性更大,每次都new
      

  6.   

    晕死
    回帖不看贴呀new了Random,那么用来标定取值位置(暂且这么叫吧)的偏移量被归位了,而每次设置的种子又相同,取得的数据肯定相同第一种方法想得到随机数必须这样改
    Random rd=new Random();
    rd.setSeed(i);
    k=rd.nextInt(3);
      

  7.   

    to caomm2001
    nextInt(int param)
    这个param是上限标志,不是种子
      

  8.   

    to lbfhappy
    决不是随机种子造成的先看看上面的帖子再说
      

  9.   

    to fool_leave() 我看了你的贴子阿我基本上明白了,怪不得用第一种方法的时候老是得到连续的一样的值
      

  10.   

    api里面只能讲解一些大致的东西和用法,细节需要看源码。
    凡是细节的东西都不要想当然。
      

  11.   

    to fool_leave()
    我现在编写一个java静态类,它会不断的被调用,如果要想产生随机效果,看来要把random的变量设置为静态类成员了,而不能放在成员函数里作为临时变量了,对吧