簡體   English   中英

Java:不包括指定數字的固定范圍內的隨機數

[英]Java: Random number in fixed range excluding specified number

在我的(Java Android)游戲中,我在隨機位置生成硬幣。

硬幣可以出現在屏幕上的 6 個水平位置之一(每個水平水平最多 2 個)。

我所做的是為第一枚硬幣創建一個 0 到 5 之間的隨機數,然后我想生成另一個隨機數,不包括第一枚硬幣的位置。

因此,例如,硬幣 1 生成在 0 和 5 之間的隨機位置 - 假設為 4。

那么下一個硬幣需要能夠在0-3或5之間進行選擇。(基本上0-5不包括4)。

我已經設法做到了,但它不是很優雅,我相信必須有更好/更清潔的方法來實現這一目標,但是,它讓我望而卻步。

下面代碼中的 random(int number) 方法只返回一個從 0 到 number-1 的隨機整數(使用 nextInt),randomBool() 只返回一個隨機布爾值

另外,請記住,如果它產生的隨機數與我們試圖避免的隨機數相等,我不想使用任何不斷重新生成隨機數的技術。

代碼

    //Return a random number between 0 and 5 excluding the specified number
    private int getRandomExcluding(int excludedNumber){

        //If previous position was 0 then generate a number between 1 and 5
        if (excludedNumber==0){
                return random(5)+1;
        }
        //If position was 5, then generate and return number from 0-4
        else if (excludedNumber==5){
                return random(5);
        }

        //If number isn't 0 or 5 (then it is in range of 1-4 use a random bool to determine
        // if we are going to get a number less than or greater than the number we are excluding

        //True - get number lower than excluded number
        else if(randomBool()){

            //Excluded number is 1
            if (excludedNumber==1){
                return 0;  //Only posibility
            }

            //Excluded number is > 1
            else {
                //Return a random number between 0 (inclusive) and the excluded number (exclusive)
                return random(excludedNumber);
                }

        //False - get number higher than the excluded number (between exludedNumber+1 (inclusive) and 6(exlusive))
        else {
                return random(6-(excludedNumber+1))+(excludedNumber+1);
        }
    }

您可以填充一個列表並對其進行洗牌:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Collections.shuffle(numbers);
int coin1 = numbers.get(0);
int coin2 = numbers.get(1);

試試這個解決方案:

private int getRandomExcluding(int excludedNumber){
    int num = random(5);
    return num >= excludedNumber ? num+1 : num;
}

它只是生成從 0 到 4 的隨機數,如果它大於或等於排除的數,則加一。 這樣,所有五個可能的數字都是均勻分布的(如果您的 RNG 生成均勻分布的數字)。

解決方案:(您可以將List<Integer> excludes更改為int... excludes如果您喜歡這種類型的輸入)

    /**
     * Get a random number between a range and exclude some numbers
     *
     * @param start start number
     * @param end end number
     * @param excludes list of numbers to be excluded
     * @return value between {@code start} (inclusive) and {@code end} (inclusive)
     */
    private int getRandomWithExclusion(int start, int end, List<Integer> excludes) {
        Collections.sort(excludes); // this method only works with sorted excludes

        int random = start + new Random().nextInt(end - start + 1 - excludes.size());
        for (int exclude : excludes) {
            if (random < exclude) {
                break;
            }
            random++;
        }
        return random;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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