java - 我的“Yahtzee”代码有时会抛出一个随机数
问题描述
好吧,所以基本上我想制作一个代码,它会生成数字,直到它第一次尝试完美的“Yahtzee”。有时它不起作用,而且我对编码还很陌生(这就是为什么这是令人厌恶的),甚至对 SO 也很陌生。我这样做只是为了教育,但我不明白为什么有时它不起作用。大约 20% 的时间,它不会说“11111”,而是随机说“11114”。帮帮我?
public class IDontKnowWhatImDoing {
public static void main(String[] args) {
int min = 1;
int max = 6;
int randomInt1 = (int)(Math.random() * (max - min + 1) + min);
int randomInt2 = (int)(Math.random() * (max - min + 1) + min);
int randomInt3 = (int)(Math.random() * (max - min + 1) + min);
int randomInt4 = (int)(Math.random() * (max - min + 1) + min);
int randomInt5 = (int)(Math.random() * (max - min + 1) + min);
while(randomInt1 != randomInt2) {
randomInt1 = (int)(Math.random() * (max - min + 1) + min);
randomInt2 = (int)(Math.random() * (max - min + 1) + min);
randomInt3 = (int)(Math.random() * (max - min + 1) + min);
randomInt4 = (int)(Math.random() * (max - min + 1) + min);
randomInt5 = (int)(Math.random() * (max - min + 1) + min);
System.out.println(randomInt1);
System.out.println(randomInt2);
System.out.println(randomInt3);
System.out.println(randomInt4);
System.out.println(randomInt5);
System.out.println();
while(randomInt2 != randomInt3) {
randomInt1 = (int)(Math.random() * (max - min + 1) + min);
randomInt2 = (int)(Math.random() * (max - min + 1) + min);
randomInt3 = (int)(Math.random() * (max - min + 1) + min);
randomInt4 = (int)(Math.random() * (max - min + 1) + min);
randomInt5 = (int)(Math.random() * (max - min + 1) + min);
System.out.println(randomInt1);
System.out.println(randomInt2);
System.out.println(randomInt3);
System.out.println(randomInt4);
System.out.println(randomInt5);
System.out.println();
while(randomInt3 != randomInt4) {
randomInt1 = (int)(Math.random() * (max - min + 1) + min);
randomInt2 = (int)(Math.random() * (max - min + 1) + min);
randomInt3 = (int)(Math.random() * (max - min + 1) + min);
randomInt4 = (int)(Math.random() * (max - min + 1) + min);
randomInt5 = (int)(Math.random() * (max - min + 1) + min);
System.out.println(randomInt1);
System.out.println(randomInt2);
System.out.println(randomInt3);
System.out.println(randomInt4);
System.out.println(randomInt5);
System.out.println();
while(randomInt4 != randomInt5) {
randomInt1 = (int)(Math.random() * (max - min + 1) + min);
randomInt2 = (int)(Math.random() * (max - min + 1) + min);
randomInt3 = (int)(Math.random() * (max - min + 1) + min);
randomInt4 = (int)(Math.random() * (max - min + 1) + min);
randomInt5 = (int)(Math.random() * (max - min + 1) + min);
System.out.println(randomInt1);
System.out.println(randomInt2);
System.out.println(randomInt3);
System.out.println(randomInt4);
System.out.println(randomInt5);
System.out.println();
}
}
}
}
}
}
解决方案
问题在于您用来检查是否有相同数字的五个的条件。如果某个条件已经为假(数字匹配),则不要输入该外观。
例如,如果您随机生成五个数字,其中前两个恰好相等,那么randomInt1 != randomInt2
将是错误的。然后,您将永远不会进入该while(randomInt1 != randomInt2)
块,并以最初的一组数字退出,即使您只检查了前两个是否相等,而不是其他 3。这个问题存在于嵌套循环的每一级。
直接的解决方案是改用do-while
循环(并删除第一个数字生成器块)。这允许每对数字至少被检查一次。
然而,这是一个不雅的解决方案。假设您仍然希望每次生成五个数字(如在 Yahtzee 中,而不是像一次生成一个骰子这样更简单的东西),那么使用单个do-while
循环会更干净。在这种情况下,您可以有一个随机数调用块,而不是不同嵌套级别的冗余调用。条件将让它继续循环,直到所有 5 个都相等。
推荐阅读
- sql - SQL Server:在表中插入缺失月份的默认值
- java - 通过改造在 android Studio 中获取
- django - 2 个 django 应用程序的 Nginx 配置 2 个不同的端点 1 个服务器主机
- odoo - 基于域的继承看板视图中的不可见字段
- selenium - 使用带有 selenium 的 chromedriver 时会话未创建错误
- ios15 - 更改路线时 iOS 15 视频闪烁问题上的 html5 视频标签问题
- sql - 用于过滤目的的临时数据
- google-apps-script - Google 云端硬盘 - 搜索共享云端硬盘
- salesforce - 如果在 salesforce 中启用了 ICU,则 DateTime.parse() 不起作用
- jhipster - 缺少类 DefaultPersistenceUnitManager