【问题标题】:Inconsistent results with random rolls and some math随机掷骰和一些数学结果不一致
【发布时间】:2019-10-24 20:16:55
【问题描述】:

我正在编写一个程序来掷 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 面骰子。然后它应该找到最小值打印,然后计算总和并打印它

【问题讨论】:

  • “有时不会得到最小值或得到两个”是什么意思?你能展示一些具体的预期和意想不到的输出吗?第一个猜测是将System.out.println("Smallest: " + min); 移出循环。
  • 为什么每次调用 dice() 时都要重新初始化 random

标签: java arraylist random


【解决方案1】:

查看这段代码:

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) &lt; min) 将始终为 false,并且您永远不会打印“Smallest...”。

另外请注意,每次你发现一个比你看到的最后一个小的骰子时,你会再次打印出“Smallest...”,所以如果你有多个骰子大小递减,你会打印那行多次退出。

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

// 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 为空的情况。

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2021-04-06
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多