首页 > 解决方案 > 随机数生成器在创建新对象时返回相同的结果

问题描述

我目前正在自学java,其中一个练习题的最终输出需要为不同的对象使用不同的名称(这取决于随机数生成器)。但是,每次我创建对象时,这些对象最终都具有相同的名称。为了给出一个清晰的例子,下面是示例输出:

预期产出

以下是我的输出:

在此处输入图像描述

正如我的输出中突出显示的那样,我所有的动物都有相同的名字,而预期的输出有不同的名字。我已经测试了多次,并且可以确认这不是由于某种运气。

我的Cow类代码(构造名称和其他信息)如下(我省略了不相关的方法):

import java.lang.Math;
import java.util.Random;

public class Cow implements Milkable, Alive {
    private String name;
    private double capacity;
    private double amount;

    private static final String[] NAMES = new String[]{
        "Anu", "Arpa", "Essi", "Heluna", "Hely",
        "Hento", "Hilke", "Hilsu", "Hymy", "Ihq", "Ilme", "Ilo",
        "Jaana", "Jami", "Jatta", "Laku", "Liekki",
        "Mainikki", "Mella", "Mimmi", "Naatti",
        "Nina", "Nyytti", "Papu", "Pullukka", "Pulu",
        "Rima", "Soma", "Sylkki", "Valpu", "Virpi"};

    private static final String randName = NAMES[new Random().nextInt(NAMES.length)];

    // Default Constructor <- where issue is
    public Cow(){
        this(randName);
    }

    // Overloaded Constructor
    public Cow(String name){
        this.name = name;   
        this.capacity = (15.0 + new Random().nextInt(26)); 
        this.amount = 0.0;
    }

    // accessors...
    // milk... removes milk from cow's tank (implements Milkable interface)
    // liveHour... adds milk to cow's tank (implements Alive interface)
    // toString...
}

另外,这是我上面使用的主要类(再次省略了不必要的部分):

        Farm farm = new Farm("Esko", new Barn(new BulkTank()));

        farm.addCow(new Cow());
        farm.addCow(new Cow());
        farm.addCow(new Cow());

        System.out.println(farm);

这篇文章表明,如果构造函数上已经设置了种子,那么随机数生成器最终是确定性的。但是,我的随机数生成器必须有一个特定的种子(在这种情况下包含随机名称的数组长度)才能选择随机名称。我想知道是否有人知道让我的随机数生成器产生新值的方法。先感谢您。

标签: javarandom

解决方案


问题是这一行:

private static final String randName = NAMES[new Random().nextInt(NAMES.length)];

您将 定义randName为静态变量,它绑定到类而不是实例,这意味着 的每个实例都Cow具有相同的randName.

在您的默认构造函数中,您应该具有:

public Cow(){
    this(NAMES[new Random().nextInt(NAMES.length)]);
}

推荐阅读