A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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是用来产生随机数的,那为什么是产生的是完全相同的两个随机数呢?

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

12 个回复

正序浏览
楼主可以用两个随机变量接受两次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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
clp 中级黑马 2013-5-24 23:44:58
12#
我拷了你的代码结果成这样了,你检查一下,运行的可能不是这个,注意运行的文件名称

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

捕获.JPG

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
说实话,我运行了好几次,也是相等的。看来我可以买彩票了。
回复 使用道具 举报
  只能说 你可以去买彩票了
回复 使用道具 举报
我在Eclipse中运行该代码,每一次的结果都不一样。不知道楼主是什么情况,很诡异哦!
回复 使用道具 举报
这本来就不是真正的随机数。是一个伪随机数算法。如果你想真的做成随机数。需要做进一步的处理。比如放入set集合中,set集合是不允许重复元素的,或者其他的办法
回复 使用道具 举报
我运行了半天也没遇到相等的情况,随机遇到相等也正常,你可能真的碰到小概率事件了,建议去买彩票玩玩。不过我确产生了负数,我没细看代码,现在头疼,有出现的帮助解释一下吧。
回复 使用道具 举报
还是你运行的次数少,相等是随机的。如果让他们放在循环里,更容易看出结果
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();
         
}
}

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
我运行了代码,每次随机都不一样啊。

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

QQ截图20130524212109.png

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
恩,我想问 我的代码运行了,为什么是两个相同的数值
回复 使用道具 举报
不好意思,打错了,忘了括号,应该是下面这样:
int number = (int)(Math.random()*1000);//随机产生0——1000的整型数
回复 使用道具 举报
int number = (int)(Math.random*1000);//随机产生0——1000的整型数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马