Java随机地在2个地方有不同的行为

时间:2013-12-21 21:08:32

标签: java random

我已经厌倦了在没有找到解决方案的情况下在Google上搜索...

这是相关代码:

public class Main {

  public char source[] = { 'd', 'o', 'i', 't', 'r', 'e', 'c', 'n', 'x', 'y' }; 

  //...
  // I don't have a given seed, which is the right approach, 
  //   from what I've read until now
  Random rand = new Random(); 
  //...
  public void init() {
      char config[] = new char[10];

      int life= 0;
      int pos;
      for (int j = 0; j < 100; j++) {
          for (int i = 0; i < 10; i++) {
              do {
                  pos = rand.nextInt(10);
              } while (source[pos] == '?');
              config[i] = source[pos];
              source[pos] = '?';
          }
          life= rand.nextInt((30 + 1) -1);
          population[j] = new Individual(config, 0, life);
          //...
      }
  }
  //...
}

当我在init方法中调用main()时,我会从群体中获得相同的序列,生命中的不同数字。我尝试在rand方法中创建init(),将其作为参数从main()发送,没有任何效果。

我的问题是:如何为人群生成真正随机的序列?

个人:

public class Individual {
    private char config[];
    private int age;
    private int life;

    //default constr

    public Individ(char config[], int age, int life) {
      this.config= config;
      this.age= age;
      this.life= life;
    }

    //getters, setters
}

主要():

public static void main(String[] args) {
  Main main = new Main();
      main.init();
      for (int i = 0; i < 100; i++) {
      for (int j = 0; j < 10; j++){
          System.out.print(main.population[i].getConfig()[j] + " ");
      }
      System.out.println(main.population[i].getAge() + " " + main.populatie[i].getLife());
      }
}

输出:

...
e o x c i r y t d n 0 15
e o x c i r y t d n 0 25
e o x c i r y t d n 0 12
e o x c i r y t d n 0 22
e o x c i r y t d n 0 15
...

1 个答案:

答案 0 :(得分:3)

问题不在于您的数字生成器,而是您传递给所有个人的config数组。数组是引用对象,因此当您在循环中更改config以为下一个人准备时,更改将在您之前创建的Individual的所有实例中显示。

您需要在config的构造函数中复制Individual,或者在for循环的每次迭代中使用新数组:

int life= 0;
int pos;
for (int j = 0; j < 100; j++) {
    char config[] = new char[10]; // <<== Move the declaration here
    for (int i = 0; i < 10; i++) {
        do {
            pos = rand.nextInt(10);
        } while (source[pos] == '?');
        config[i] = source[pos];
        source[pos] = '?';
    }
    life= rand.nextInt((30 + 1) -1);
    population[j] = new Individual(config, 0, life);
}

现在每个Individual都会获得自己的config副本,确保每个人都不同。