int[] getRandoms(int[] ranges, int n, int[] excepts) {
int min = ranges[0];
int max = ranges[1];
int[] results = new int[n];
for (int i = 0; i < n; i++) {
int randomValue = new Random().nextInt(max - min + 1) + min;
if (ArrayUtils.contains(results, randomValue) || ArrayUtils.contains(excepts, randomValue)) {
i--;
} else {
results[i] = randomValue;
}
}
return results;
}
的Util類
public static class ArrayUtils {
public static boolean contains(int[] array, int elem) {
return getArrayIndex(array, elem) != -1;
}
/** Return the index of {@code needle} in the {@code array}, or else {@code -1} */
public static int getArrayIndex(int[] array, int needle) {
if (array == null) {
return -1;
}
for (int i = 0; i < array.length; ++i) {
if (array[i] == needle) {
return i;
}
}
return -1;
}
}
使用
int[] randomPositions = getRandoms(new int[]{0,list.size()-1}, 3, new int[]{0,1});
它會在你的列表中隨機3個項目,除了項目0和項目1
這實際上是個不錯的主意! 非常感謝! – Yokhen
IndexOutOfBoundsException的可用保護: return n> copy.size()? copy.subList(0,copy.size()):copy.subList(0,n); – pawegio
當您只需要3個元素時,將整個列表進行整理對於大型列表來說是非常浪費的。 – Eyal