選擇沒有重複的隨機數

/**
 * returns a array of random numbers with no duplicates
 * @param range the range of possible numbers for ex. if 100 then it can be anywhere from 1-100
 * @param length the length of the array of random numbers
 * @return array of random numbers with no duplicates.
 */
public static int[] getRandomNumbersWithNoDuplicates(int range, int length){
    if (length<range){
        // this is where all the random numbers
        int[] randomNumbers = new int[length];
        
        // loop through all the random numbers to set them
        for (int q = 0; q < randomNumbers.length; q++){
            
            // get the remaining possible numbers
            int remainingNumbers = range-q;
            
            // get a new random number from the remainingNumbers
            int newRandSpot = (int) (Math.random()*remainingNumbers);
            
            newRandSpot++;
            
            // loop through all the possible numbers
            for (int t = 1; t < range+1; t++){
                
                // check to see if this number has already been taken
                boolean taken = false;
                for (int number : randomNumbers){
                    if (t==number){
                        taken = true;
                        break;
                    }
                }
                
                // if it hasnt been taken then remove one from the spots
                if (!taken){
                    newRandSpot--;
                    
                    // if we have gone though all the spots then set the value
                    if (newRandSpot==0){
                        randomNumbers[q] = t;
                    }
                }
            }
        }
        return randomNumbers;
    } else {
        // invalid can't have a length larger then the range of possible numbers
    }
    return null;
}

該方法通過迴圈通過具有所請求長度大小的陣列並找到可能數字的剩餘長度來工作。它設定了這些可能數字 newRandSpot 的隨機數,並在未採用的數字內找到該數字。它通過迴圈遍歷範圍並檢查是否已經採用該數字來完成此操作。

例如,如果範圍是 5 並且長度是 3 並且我們已經選擇了數字 2.然後我們有 4 個剩餘數字,所以我們得到 1 到 4 之間的隨機數,我們迴圈遍歷範圍(5)跳過任何數字我們已經使用過(2)。

現在讓我們說在 1 和 4 之間選擇的下一個數字是 3.在第一個迴圈中,我們得到 1 還沒有被採用所以我們可以從 3 中刪除 1 使它成為 2.現在在第二個迴圈中我們得到 2 已經採取所以我們什麼都不做我們遵循這種模式,直到我們到達 4,一旦我們刪除 1 它變為 0,所以我們將新的 randomNumber 設定為 4。