我无法实现一个返回大小为n的随机紊乱的方法。我不确定我的代码有什么问题,我需要帮助搞清楚什么是逻辑错误。
这是我想写的一个小程序,但是在可视化逻辑流程时遇到了麻烦。我试过改变while循环的条件,但到目前为止我没有尝试过。我也尝试使用列表和arraylist实现,但是当我尝试将其放入代码时,它变得有点过于复杂。
有更简单的方法吗?
public static int[] derangement(int n){
int[] arr1 = new int[n];
int[] arr2 = new int[n];
//second array is to keep track of which positions are 'taken' to prevent collision
Random rand = new Random();
int temp = -1;
for(int i =0; i <n; i++){
arr1[i] = i;
}
for(int k=0;k<n;k++){
arr2[k] = -1;
}
for(int j=0;j<n;j++){
temp = j;
while (temp == j || arr2[j] != -1){
temp = rand.nextInt(n); //generate a random number until it gives one that hasn't been used before
if(arr2[temp] == -1){
arr2[temp] = j;
}
}
}
return arr2;
}
对于n = 6,我期望输出为[2,4,1,5,3,0],但我得到[-1,-1,-1,-1,-1,-1]
如何使用SortedMap,其中您的密钥将是随机的,如下所示:
public static int[] derangement(int n){
Random rand = new Random();
int[] result = new int[n];
SortedMap<Double, Integer> map = new TreeMap<>();
for (int i = 0; i < n; i++) {
map.put(rand.nextDouble(), i);
}
int i = 0;
for (Double key: map.keySet()) {
result[i] = map.get(key);
i++;
}
return result;
}
这样,随着地图中的随机键变为有序,您正在改变列表。
我们的想法是在集合中包含N个元素,然后从中挑选数字直到它耗尽。像这样的东西
List<Integer> temp = IntStream.range(0, 6).boxed().collect(Collectors.toList());
int[] array = new int[6];
while (temp.size() > 0) {
int rndIndex = ThreadLocalRandom.current().nextInt(temp.size());
array[temp.size() - 1] = temp.get(rndIndex);
temp.remove(rndIndex);
}
System.out.println(Arrays.toString(array)); // could be [4, 5, 3, 2, 1, 0]
如果您不想使用临时列表,则可以这样做,但这需要更多代码。这个想法是一样的。