随机数和线程

Random number and threads

线程有问题。我正在 运行ning“运行”方法使用三个对象,每个对象在不同的​​线程中。

是否可以从三个线程中获取相同的数字?我认为答案是否定的,但经过一些改变是否可能?

主要:

public static void main(String[] args) {
    
   Test w1,w2,w3;
    
    w1 = new Test(1);
    w2 = new Test(2);
    w3 = new Test(3);
    
    w1.start();
    w2.start();
    w3.start();

}

class:

public class Test extends Thread implements Runnable{
int number;

public Test(int number) {
    this.number = number;
}

@Override
public void run() {
    Random rnd = new Random();
    
    //int pom = ThreadLocalRandom.current().nextInt(101);
    int pom = rnd.nextInt(101);
    System.out.println("Random number: "+pom+", number of thread: "+number);
}

}

当然可以。每个线程创建一个 Random 的实例,然后从中提取相同数量的字节(即:0 到 100 之间的 1 个整数)。因此,如果它们都是相同的随机序列,你会得到相同的结果。

用设置的种子值将它们全部初始化,你就会得到你想要的。如果你愿意,你可以这样做,这样每次调用这个过程,你都会得到一个不同的种子值(所以,随机种子),但是所有的随机数 运行 同样的方式:

主要:

public static void main(String[] args) {
   Test w1,w2,w3;
   
   long seed = new Random().nextLong();
    w1 = new Test(1, seed);
    w2 = new Test(2, seed);
    w3 = new Test(3, seed);
    
    w1.start();
    w2.start();
    w3.start();
}

class:

public class Test extends Thread {
  private final int number;
  private final Random rnd;

  public Test(int number, long seed) {
    this.number = number;
    this.rnd = new Random(seed);
  }
  
  @Override
  public void run() {
    int pom = rnd.nextInt(101);
    System.out.println("Random number: "+pom+", number of thread: "+number);
  }
}

我还清理了一些样式问题(private final 在字段上,让 Random 的实例成为一个字段而不是一个字段来存储 Random 对我来说更有意义=15=]分开。