java - 随机数生成器在创建新对象时返回相同的结果
问题描述
我目前正在自学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);
这篇文章表明,如果构造函数上已经设置了种子,那么随机数生成器最终是确定性的。但是,我的随机数生成器必须有一个特定的种子(在这种情况下包含随机名称的数组长度)才能选择随机名称。我想知道是否有人知道让我的随机数生成器产生新值的方法。先感谢您。
解决方案
问题是这一行:
private static final String randName = NAMES[new Random().nextInt(NAMES.length)];
您将 定义randName
为静态变量,它绑定到类而不是实例,这意味着 的每个实例都Cow
具有相同的randName
.
在您的默认构造函数中,您应该具有:
public Cow(){
this(NAMES[new Random().nextInt(NAMES.length)]);
}
推荐阅读
- django - 如果没有选择图像,则获取用户的旧图像
- google-sheets - 输入新数据时Google表格单元格/公式未更新
- javascript - 使用移动设备大小的菜单按钮后,导航栏消失(在全尺寸窗口中)
- apache-nifi - 是否可以选择性地将流文件写入 nifi 中的 tcp 连接?
- python - 将 Object 类型转换为 Float 类型
- firebase - Flutter:Firebase身份验证无需登录即可创建用户
- php - 如何检查某个字符串是否是来自两个单独列的值的组合,即表 PHP MySql
- asp.net - RouteAttribute中的Name参数有什么用?
- android - MainActivity 出了点问题,我不明白
- javascript - 调用graphQL服务器突变到axios url