/** * 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){ // 这是所有随机数的所在 int[] randomNumbers = new int[length]; // 遍历所有随机数以设置它们 for (int q = 0; q < randomNumbers.length; q++){ // 得到剩余的可能数字 int remainingNumbers = range-q; // 从剩余的数字中获得一个新的随机数 int newRandSpot = (int) (Math.random()*remainingNumbers); newRandSpot++; // 遍历所有可能的数字 for (int t = 1; t < range+1; t++){ // 检查此号码是否已被使用 boolean taken = false; for (int number : randomNumbers){ if (t==number){ taken = true; break; } } // 如果尚未服用,则从斑点中取出 if (!taken){ newRandSpot--; // 如果我们走遍了所有景点,则设置值 if (newRandSpot==0){ randomNumbers[q] = t; } } } } return randomNumbers; } else { // 无效的长度不能大于可能的数字范围 } return null; }
该方法通过遍历具有请求长度的大小的数组并找到可能数字的剩余长度来工作。它设置这些可能数字的随机数,newRandSpot并在剩余的未取数字内找到该数字。它通过遍历范围并检查该数字是否已被使用来做到这一点。
例如,如果范围是5,长度是3,并且我们已经选择了数字2。那么我们剩下4个数字,因此我们得到1到4之间的随机数,然后我们循环通过range(5)跳过任何数字我们已经使用过的(2)。
现在让我们说在1和4之间选择的下一个数字是3。在第一个循环中,我们得到1尚未被采用,因此我们可以从3中删除1使其成为2。在第二个循环中,我们得到2已被采用。所以我们什么都不做。我们遵循此模式,直到达到4,一旦删除1,它便变为0,因此将新的randomNumber设置为4。