Java 使用继承打印两个值之间的随机偶数值

Java 使用继承打印两个值之间的随机偶数值,java,class,inheritance,random,Java,Class,Inheritance,Random,我试图打印一个随机偶数列表(5次)使用边界。例如从0到30(包括这两个数字)。这是我到目前为止所拥有的(这是在它自己的类中): 这是从我的主要方法打印的地方: System.out.println("Random Even:"); for (int i = 0; i < 5; i++){ System.out.println(rand.nextEven(30)); } System.out.println(“随机偶数:”); 对于(int i=0;ii%2

我试图打印一个随机偶数列表(5次)使用边界。例如从0到30(包括这两个数字)。这是我到目前为止所拥有的(这是在它自己的类中):

这是从我的主要方法打印的地方:

System.out.println("Random Even:");
    for (int i = 0; i < 5; i++){
        System.out.println(rand.nextEven(30));
    }
System.out.println(“随机偶数:”);
对于(int i=0;i<5;i++){
系统输出打印LN(兰特nextEven(30));
}
当我运行程序时,它会给我一个错误,我不太确定如何解决这个问题。这是从0到30的偶数的期望输出示例:

四, 26 12 10
20

兰德到底是什么?它是随机类还是您自己类的实例? 因为您想对继承做一些事情,所以我想您想覆盖一个方法,但是如果rand是java随机类的实例,那么这将不起作用

这个错误可能来自递归地永远调用nextEven方法


如果你能明确你到底想做什么?

mod操作符
%
将给你第一个值的剩余部分除以第二个值

value % 2
。。。如果
为偶数,则返回0;如果
为奇数,则返回1

由于
rand
是对包含代码的类的实例的引用,因此有一个无限递归。您真正需要的是:

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

    return evenRandomValue;
}

不清楚为什么取
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).
}

我至少看到两种解决方案

第一个假设是
random+1=random
。我的意思是,如果你加或减一个随机数,你仍然会得到一个有效的随机数。这就是为什么您可以使用
Random
类在所需的周期内生成一个值,然后在数字为奇数时加上或减去一个值


第二种方法只是为所需周期生成偶数值数组。然后从这个数组中取一个随机值。

这里有一个非常明确的方法,可以使用流来实现这一点:

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

这可以理解为“在给定边界之间生成无限的随机数流,过滤掉赔率,取前5,变成
Integer
对象,然后收集到一个列表中。

您有一个无限递归,通常会导致堆栈溢出。继承从何而来?是对包含您的方法的类的引用吗?如果是这样,你有一个无限递归,正如PM 77-1所说。是的,我得到了堆栈溢出错误,但我不知道如何绕过它,或者如何不使它成为无限递归。我们的答案都没有涉及问题的继承部分@SeanLynch继承需要如何实现?Rand是我自己的classOP的一个实例,我想
nextEven(30)
应该是一个偶数“从0到30(包括这两个数字)”。“你也应该在回答中提到这一点。”安德烈亚斯我错过了答案。谢谢。虽然你的答案是正确的,但是循环跳过奇数对性能是有害的,因为你可以简单地要求一半范围内的数字,然后乘以2得到只有偶数的数字。首先解决。以后再优化。但我确实喜欢你的乐观。
List<Integer> myRandomInts = Random.ints(lower, upper + 1)
    .filter(i -> i % 2 == 0)
    .limit(5).boxed()
    .collect(Collectors.toList());