随机滚动和一些数学结果不一致



我正在制作一个程序来掷4个6面骰子,并用它们做一些简单的数学和逻辑运算。我正在运行一个非常粗略的程序草案,并开始注意到卷的数量会不一致。特别是,我有时不会得到最小的值或两个

如果在网上四处寻找解决方案,但无济于事。我甚至复制了其他例子中关于如何找到最小值的代码

public class test {
private static int dice(int s) {
int num = 0;
Random random = new Random();
num = random.nextInt(s);
num = num + 1;
return num;
}
public static void main(String[] args) {
List<Integer> rolls = new ArrayList<Integer>();
for (int i = 0; i != 4; i++) {
rolls.add(dice(6));
}
for (Integer roll : rolls) {
System.out.println(roll);
}
int min = rolls.get(0);
int index = 0;
for (int x = 0; x < rolls.size(); x++) {
if (rolls.get(x) < min) {
min = rolls.get(x);
index = x;
System.out.println("Smallest: " + min);
}
}
int sum = 0;
for (int x : rolls) {
sum += x;
}
System.out.println("Sum:" + sum);
}
}

这应该会产生4个6边骰子。然后它应该找到打印的最小值,然后计算总和并打印

查看这段代码:

int min = rolls.get(0);
int index = 0;
for(int x = 0; x<rolls.size(); x++){
if(rolls.get(x) < min){
min=rolls.get(x);
index = x;
System.out.println("Smallest: " + min);
}
}

如果rolls.get(0);是你的最小滚动量,会发生什么?在这种情况下,if(rolls.get(x) < min)将始终为false,并且您永远不会打印"最小…">

还要注意的是,每次你发现一个比你上次看到的骰子小的骰子时,你都会再次打印出"最小…",所以如果你有多个按降序排列的骰子,你会多次打印出这条线。

将初始min值设置为7,这样就可以保证最小值小于初始状态。然后,不要在循环内打印,而是保存最小值,并在循环完成后打印"最小…":

// Be aware that this code doesn't work correctly if your List is empty.
int min = 7; // You could also set this to rolls.get(0) and start your loop at 1
for (int x = 0; x < rolls.size(); x++) {
if (rolls.get(x) < min) {
min = rolls.get(x);
}
}
System.out.println("Smallest: " + min);

(我还删除了index,因为它没有在代码中的任何地方使用(。


如果你想在这方面更现代(也更强大(,你也可以做:

rolls.stream()
.min(Integer::compareTo)
.ifPresent(min -> System.out.println("Smallest: " + min));

这将通过不打印任何内容来处理rolls为空的情况。

最新更新