[英]Printing random even value between two values using inheritance
我正在尝试使用边界打印随机偶数列表(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
不清楚为什么取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 类还是您自己的类的实例? 因为你想用继承做一些事情,我猜你想覆盖一个方法,但如果 rand 是 java Random 类的一个实例,这将不起作用。
错误可能来自永远递归调用 nextEven 方法。
如果你能澄清一下你到底想做什么?
mod 运算符%
将为您提供第一个值除以第二个值的余数。
value % 2
...如果value
偶数,则返回 0,如果value
奇数,则返回 1。
由于rand
是对包含您的代码的类的实例的引用,因此您具有无限递归。 你真正需要的是这样的:
public int nextEven(int h){
int evenRandomValue;
do {
evenRandomValue = (int)(Math.random() * (h + 1));
} while(evenRandomValue % 2 == 1);
return evenRandomValue;
}
我看到至少两种解决方案。
第一个假设random + 1 = random
。 我的意思是,如果您添加或减去一个随机数,您仍然会得到一个有效的随机数。 这就是为什么您可以使用Random
类在所需时间段内生成一个值,然后在数字为奇数时加上或减去一个值。
第二种方法只是生成所需时间段的偶数值数组。 然后从这个数组中取一个随机值。
这是使用流实现此目的的一种非常明确的方法:
List<Integer> myRandomInts = Random.ints(lower, upper + 1)
.filter(i -> i % 2 == 0)
.limit(5).boxed()
.collect(Collectors.toList());
这可以理解为“在给定的边界之间生成无限的随机数流,过滤掉赔率,取前 5 个,变成Integer
对象,然后收集到一个列表中。”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.