Непоследовательные результаты со случайными бросками и немного математики - PullRequest
0 голосов
/ 24 октября 2019

Я работаю над созданием программы для броска 4-х шестигранных костей и выполнения простых математических и логических операций с ними. Я запустил очень черновой вариант программы и начал замечать, что количество бросков будет несовместимым. В частности, я бы иногда не получал наименьшее значение или получал бы два

Если бы поискать решение онлайн безрезультатно. Я даже скопировал код из других примеров того, как найти наименьшее значение

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-ти сторонних кубиков. Затем он должен найти наименьшее значение, которое выведите, затем вычислить сумму и вывести ее

1 Ответ

3 голосов
/ 24 октября 2019

Проверьте этот бит кода:

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) всегда будет ложным, и вы никогда не напечатаете «Smallest ...».

Также обратите внимание, что каждый раз, когда вы находите бросок, который меньше, чем последний, на который вы смотрели, вы снова выводите «Smallest ...», поэтому, если у вас есть несколько кубиков в порядке убывания, вы напечатаете эту строку несколько раз.

Установите исходное значение min равным 7, чтобы выгарантированно иметь минимальное значение, которое меньше, чем начальное состояние. И затем, вместо печати внутри цикла, сохраните min и напечатайте «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 пустой, просто ничего не печатая.

...