我已经厌倦了在没有找到解决方案的情况下在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
...
答案 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
副本,确保每个人都不同。