选择没有重复的随机数

/**
 * 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。