Печать случайных четных значений между двумя значениями с использованием наследования - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь распечатать список случайных четных чисел (5 раз), используя границы.Пример от 0 до 30 (включая оба эти числа).Это то, что я до сих пор (это в своем собственном классе):

public int nextEven(int h){
        int n = rand.nextEven(h) % 2;
        return n;
        }

Вот где он будет печатать из моего основного метода:

System.out.println("Random Even:");
    for (int i = 0; i < 5; i++){
        System.out.println(rand.nextEven(30));
    }

Когда я запускаю программуэто дает мне ошибку, и я не совсем уверен, как решить эту проблему.Это пример желаемого вывода четных чисел от 0 до 30:

4 26 12 10 20

Ответы [ 5 ]

0 голосов
/ 27 сентября 2018

Вот довольно явный способ добиться этого с помощью потоков:

List<Integer> myRandomInts = Random.ints(lower, upper + 1)
    .filter(i -> i % 2 == 0)
    .limit(5).boxed()
    .collect(Collectors.toList());

Это можно прочитать как «создать бесконечный поток случайных чисел между заданными границами, отфильтровать шансы, взять первые 5,превратить в Integer объекты и затем собрать в список.

0 голосов
/ 27 сентября 2018

Я вижу как минимум два решения.

Первый предполагает, что random + 1 = random.Я имею в виду, что если вы добавите или вычтете случайное число, вы все равно получите действительное случайное число.Вот почему вы можете использовать класс Random, чтобы сгенерировать значение в желаемом периоде, а затем добавить или вычесть его, если число нечетное.

Второй подход - просто создать массив четных значений для желаемогопериод.Затем возьмите случайное значение из этого массива.

0 голосов
/ 27 сентября 2018

Оператор мода % даст вам остаток первого значения, деленный на второе.

value % 2

... вернет 0, если value четное, или 1, если value нечетно.

Поскольку rand является ссылкой на экземпляр класса, содержащего ваш код, у вас бесконечная рекурсия.Что вам действительно нужно, это что-то вроде:

public int nextEven(int h){
    int evenRandomValue;
    do {
        evenRandomValue = (int)(Math.random() * (h + 1));
    } while(evenRandomValue % 2 == 1);

    return evenRandomValue;
}
0 голосов
/ 27 сентября 2018

Непонятно, почему взятие оставшейся части 2 даст четное число.Вместо этого сгенерируйте число в диапазоне от 0 до h / 2, а затем умножьте результат этого на 2.Мол,

public int nextEven(int h){
    int n = ThreadLocalRandom.current().nextInt(1 + (h / 2)); // 0 to (h / 2) inclusive
    return n * 2; // n * 2 is even (or zero).
}
0 голосов
/ 27 сентября 2018

Что такое ранд?Это случайный класс или экземпляр вашего собственного класса?Поскольку вы хотите что-то сделать с наследованием, я думаю, вы хотите перезаписать метод, но если rand является экземпляром java-класса Random, это не сработает.

Ошибка, вероятно, происходит из-за рекурсивного вызова метода nextEven навсегда.

Если бы вы могли уточнить, что именно вы хотите сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...