java - java - 如何在java中生成列表/数组的随机混乱?
问题描述
我在实现返回大小为 n 的随机混乱的方法时遇到问题。我不确定我的代码有什么问题,我需要帮助找出逻辑上的错误。
这是一个我只想编写但无法可视化逻辑流程的小程序。我尝试过更改 while 循环的条件,但到目前为止我没有尝试过任何工作。我也尝试通过使用列表和数组列表来实现,但是当我尝试将它放入代码时它变得有点太复杂了。
有没有更简单的方法来做到这一点?
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]
解决方案
这个想法是在一个集合中包含 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]
如果您不想使用临时列表,则可以这样做,但这需要更多代码。这个想法是一样的。
推荐阅读
- python-xarray - xr.apply_ufunc 过滤 3d x 数组
- css - 反应原生绝对定位
- amazon-redshift - Amazon Redshift 和删除性能
- javascript - Javascript - 从其他文件插入AdjacentHTML
- django - 两种加载csv文件的方式,在人多的情况下,哪一种比较快
- oracle - micronaut-data:多个数据源
- powerquery - 电源查询 - 一年的参考单元格
- templates - Rsyslog 模板 - 仅包含消息保存到文件
- for-loop - 使用游标插入记录的plsql过程
- java - 将 MockClientHttpResponse 与 HttpStatus.Series.CLIENT_ERROR 一起使用