【问题标题】:Why does this random generator return the same result over and over?为什么这个随机生成器一遍又一遍地返回相同的结果?
【发布时间】:2015-11-24 02:41:28
【问题描述】:

我写这个是为了生成随机的Candidate 对象来填充ArrayList pop。每个Candidate 都有一个数组,这段代码应该为每个Candidate 生成一个不同的数组:

ArrayList<Candidate> pop = new ArrayList<>();
int skinThicknes, attackDamage ,skinCoulor, canFly, canSwing, speed, flySpeed, swingSpeed, num = 0;
Random rnd;
rnd = new Random();
while(num < size) {

    skinThicknes = rnd.nextInt(101);
    attackDamage = rnd.nextInt(101);
    skinCoulor = rnd.nextInt(3);
    canFly = rnd.nextInt(1);
    canSwing = rnd.nextInt(1);
    speed = rnd.nextInt(1001);
    flySpeed = rnd.nextInt(1001);
    swingSpeed = rnd.nextInt(1001);
    if(canFly == 0){flySpeed = 0;}
    if(canSwing == 0){swingSpeed  = 0;}
    int[] array = {skinThicknes, attackDamage, skinCoulor, canFly, canSwing, speed, flySpeed, swingSpeed};
    Candidate can;
    can = new Candidate(array);
    pop.add(can);
    num++;
}
return pop;

为什么pop中每个Candidate的数组都相等?


这是Candidate 的构造函数。所有这些变量 (skinTicknesattackDamage 等)是private static ints。

public Candidate(int[] geno){
    skinTicknes = geno[0];
    attackDamage = geno[1];
    skinCoulor = geno[2];
    canFly = geno[3];
    canSwing = geno[4];
    speed = geno[5];
    flySpeed = geno[6];
    swingSpeed = geno[7];
}

【问题讨论】:

  • rnd.nextInt(1);?真的吗?你认为这会返回什么?
  • Candidate是如何实现的?
  • 嗯....不完全是。它会返回 0,而且只有 0。
  • 这就是为什么你应该检查 API,因为它会告诉你。
  • 如果每个候选人都与其他候选人相同,并且每次运行时候选人都不一样,那么问题可能出在候选人类。

标签: java arrays random


【解决方案1】:

如果您阅读API,您会注意到rnd.nextInt(1) 将始终返回零(0)。这意味着您的 canFlycanSwing 值将始终相同,这反过来意味着您的 flySpeedswingSpeed 将始终相同。

在那之后,我想我们需要看看Candidate 的定义,看看为什么其余的总是一样的。是什么让您相信ArrayList 的所有元素都是相同的?你也可以给我们看一下代码吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-15
    • 2015-08-04
    • 2017-02-15
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2020-09-03
    • 2020-07-19
    相关资源
    最近更新 更多