黑马程序员技术交流社区

标题: random不是产生随机数的吗,为什么产生一样的随机数? [打印本页]

作者: 刘海陆    时间: 2013-5-24 20:56
标题: random不是产生随机数的吗,为什么产生一样的随机数?
import java.util.Random;
public class Test {
private static int data ;
/**
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
        new Thread(new Runnable() {
   
   @Override
   public void run() {
    // TODO Auto-generated method stub
    data = new Random().nextInt();
    System.out.println(data);
   }
  }).start();
        new Thread(new Runnable() {
   
   @Override
   public void run() {
    // TODO Auto-generated method stub
       data = new Random().nextInt();
    System.out.println(data);
   }
  }).start();
        
}
}


上面的代码,运行的结果是在控制台上打印的两个数,是完全相同的。运行了好多次都是这样,
既然random是用来产生随机数的,那为什么是产生的是完全相同的两个随机数呢?


作者: 736633626    时间: 2013-5-24 21:02
int number = (int)(Math.random*1000);//随机产生0——1000的整型数
作者: 736633626    时间: 2013-5-24 21:03
不好意思,打错了,忘了括号,应该是下面这样:
int number = (int)(Math.random()*1000);//随机产生0——1000的整型数
作者: 刘海陆    时间: 2013-5-24 21:05
恩,我想问 我的代码运行了,为什么是两个相同的数值
作者: 736633626    时间: 2013-5-24 21:22
我运行了代码,每次随机都不一样啊。

QQ截图20130524212109.png (6.13 KB, 下载次数: 0)

QQ截图20130524212109.png

作者: 谢孔营    时间: 2013-5-24 21:28
还是你运行的次数少,相等是随机的。如果让他们放在循环里,更容易看出结果
package com.sdut.day5;
import java.util.Random;


public class Test {
private static  int data ;
/**
   * @param args
   */
public static void main(String[] args) {
   // TODO Auto-generated method stub
         new Thread(new Runnable() {
   
    @Override
    public void run() {
     // TODO Auto-generated method stub
            while(true){
                    data = (int)(Math.random()*1000);
                 System.out.println("-------run1-----"+data);
            }
    }
   }).start();
         new Thread(new Runnable() {
   
    @Override
    public void run() {
     // TODO Auto-generated method stub
            while(true){
                    data =  (int)(Math.random()*1000);
                 System.out.println("--run2"+data);
            }
    }
   }).start();
         
}
}

作者: 王浩骅    时间: 2013-5-24 21:33
我运行了半天也没遇到相等的情况,随机遇到相等也正常,你可能真的碰到小概率事件了,建议去买彩票玩玩。不过我确产生了负数,我没细看代码,现在头疼,有出现的帮助解释一下吧。
作者: Jacky_Chen1990    时间: 2013-5-24 21:35
这本来就不是真正的随机数。是一个伪随机数算法。如果你想真的做成随机数。需要做进一步的处理。比如放入set集合中,set集合是不允许重复元素的,或者其他的办法
作者: student    时间: 2013-5-24 22:06
我在Eclipse中运行该代码,每一次的结果都不一样。不知道楼主是什么情况,很诡异哦!
作者: 花开花落总相似    时间: 2013-5-24 22:46
  只能说 你可以去买彩票了
作者: 谢孔营    时间: 2013-5-24 22:52
说实话,我运行了好几次,也是相等的。看来我可以买彩票了。
作者: clp    时间: 2013-5-24 23:44
我拷了你的代码结果成这样了,你检查一下,运行的可能不是这个,注意运行的文件名称

捕获.JPG (71.39 KB, 下载次数: 0)

捕获.JPG

作者: 刘国强    时间: 2013-5-25 01:46
楼主可以用两个随机变量接受两次random()产生的随机数,不要用一个变量来接收。
这个错误时因为两个线程,共同使用一个变量。出现第一个线程刚运算出data的值,还未显示的时候第二个线程运行,覆盖第一个线程产生的data的值,第二个线程显示完毕后,第一个线程继续运行,此时显示的data的值也为第二个线程的运算结果,出现错误,所以导致两次产生的随机数显示一样。

下面是我修改后的代码,不会产生一样的情况了
  1. package abc;

  2. import java.util.Random;

  3. public class a {

  4.         private static int data1 ;
  5.         private static int data2 ;
  6.         public static void main(String[] args) {
  7.                   
  8.                 new Thread(new Runnable() {
  9.                         @Override
  10.                         public void run() {
  11.                            data1 = new Random().nextInt();
  12.                            System.out.println(data1);
  13.                         }
  14.                 }).start();
  15.                
  16.                
  17.                 new Thread(new Runnable() {
  18.                     
  19.                    @Override
  20.                    public void run() {
  21.                        data2 = new Random().nextInt();
  22.                    System.out.println(data2);
  23.                     }
  24.                 }).start();
  25.                         
  26.         }
  27. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2