簡體   English   中英

使用繼承在兩個值之間打印隨機偶數值

[英]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的余數會產生偶數。 相反,生成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).
}

蘭特究竟是什么? 它是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM