【问题标题】:Printing random even value between two values using inheritance使用继承在两个值之间打印随机偶数值
【发布时间】:2018-09-26 22:40:54
【问题描述】:

我正在尝试使用边界打印随机偶数列表(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

【问题讨论】:

  • 你有一个无限递归,通常会导致堆栈溢出。
  • 继承从何而来?
  • rand 是对包含您的方法的类的引用吗?如果是这样,您就有了 PM 77-1 所说的无限递归。
  • 是的,我遇到了堆栈溢出错误,但我不确定如何解决它或如何不使其成为无限递归
  • 我们的答案都没有涉及问题的继承部分。 @SeanLynch 继承需要如何进入?

标签: java class inheritance random


【解决方案1】:

不清楚为什么取2 的剩余部分会产生偶数。相反,在0h / 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).
}

【讨论】:

  • OP 想要/认为nextEven(30) 应该是一个偶数“从 0 到 30(包括这两个数字)”。您也应该在答案中解决这个问题。
  • @Andreas 我错过了包括在内。谢谢。
【解决方案2】:

究竟什么是兰特?它是 Random 类还是您自己的类的实例? 既然你想用继承做一些事情,我猜你想覆盖一个方法,但如果 rand 是 java Random 类的一个实例,这将不起作用。

错误可能来自于递归调用 nextEven 方法。

如果你能澄清你到底想做什么?

【讨论】:

  • Rand 是我自己的类的一个实例
【解决方案3】:

我至少看到了两种解决方案。

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

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

【讨论】:

    【解决方案4】:

    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;
    }
    

    【讨论】:

    • 虽然您的答案是正确的,但循环跳过奇数对性能不利,因为您可以简单地要求范围内一半的数字并乘以 2 以获得仅偶数。
    • 先解决。后期优化。但我确实喜欢你的优化。
    【解决方案5】:

    这是使用流实现此目的的一种非常明确的方法:

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2014-03-20
      • 2023-03-19
      • 2018-09-18
      • 1970-01-01
      相关资源
      最近更新 更多