2

您好,我有以下任务:

首先,我得到这段代码,它使用一种方法生成随机数 100 次:

public class Q3 {
    public static void printDiceRolls(Random randGenerator) {

        for (int i = 0; i < 100; i++) {
            System.out.println(randGenerator.nextInt(6) + 1);
        }
    }

    public static void main(String[] args) {
        Random man = new Random();
        printDiceRolls(man);
    }
}

其次,我被要求创建一个LoadedDice扩展类的Random类:

public class LoadedDice extends Random {
    // instance variables - replace the example below with your own
    public int nextInt(int num) {
        // code right here
        return 3;
    }
}

然后我被要求覆盖public int nextInt ( int num )并执行以下操作

重写公共 int nextInt(int num) 方法,使得新方法有 50% 的机会总是返回可能的最大数字(即 num-1),并且有 50% 的机会返回 Random 的 nextInt 方法将返回

我不太明白在这种情况下我的重写方法应该做什么。

建议?

4

4 回答 4

1

使用另一个 Random 实例给您 50% 的机会(例如 nextInt(100) >= 50),然后基于此返回一个常数或一个真正的随机数。

于 2013-03-08T00:36:55.427 回答
1

我想这样做的一种方法是使用(另一种?)具有均匀分布的随机数生成器并将其设置为返回 0 或 1。0/1 将是您做出决定的 50%....返回 super.nextInt 或最大数量。

于 2013-03-08T00:38:31.393 回答
0

对我来说,该函数似乎nextInt(int)提供了一个介于 1 和输入之间的数字。在根Random类中,此函数在该范围内找到一个随机数。他们想要你做的是改变它,以便一半时间它会返回范围内的随机数,但另一半时间它会给出最大数字。

在他们给出的示例中,您正在掷骰子,因此范围是 1-6。通常,nextInt会找到一个介于 1 和 6 之间的随机数。但是您的新函数只会在一半时间内完成。另一半时间,它将返回 6。

我对如何实现它有一个想法,但是走那么远似乎是作弊。^^;

于 2013-03-08T00:35:07.900 回答
0
if(super.nextBoolean())
    return num-1;
return super.nextInt(num);

如果num<Integer.MAX/2,我们可以

int x = super.nextInt(num*2);
return Math.min(x, num-1);
于 2013-03-08T00:41:24.560 回答