我想在java中对我的2D数组进行洗牌,这个数组的数据是:
2.5 2.6
2.0 3.0
3.0 3.0
这是我的随机播放方法:
public void shuffleData(){
Random rnd = new Random();
double temp[][] = new double[this.NBaris][NKolom];
this.dataShuffle = new double[this.NBaris][NKolom];;
for(int i = this.NBaris-1; i >= 0; i--){
int index = rnd.nextInt(i + 1);
for(int j = 0; j < this.NKolom; j++){
temp[0][j] = this.data[index][j];
this.dataShuffle[index][j] = this.dataShuffle[i][j];
this.dataShuffle[i][j] = temp[0][j];
}
}
}
但是当我打印时,结果会变成这样:
2.5 2.6
2.5 2.6
2.0 3.0
我的方法有什么问题?,你能帮助我吗?感谢。
答案 0 :(得分:1)
存在不同的问题
this.data[index][j]
中取一个随机值(可能是相同值的多倍)并将其存储在数组dataShuffle中。当您发现时,这会导致意外的重复行。如果你只想改变行的顺序并将值保持在同一列中,你可以这样做。
double[][] data = {{1.1, 1.2}, {2.1, 2.2}, {3.1, 3.2}};
List<double[]> asList = Arrays.asList(data);
Collections.shuffle(asList);
data = asList.toArray(new double[0][0]);
System.out.println("toArray = " + Arrays.deepToString(data));
示例输出
toArray = [[1.1, 1.2], [3.1, 3.2], [2.1, 2.2]]
如果您不想仅对行进行随机播放,还要对列之间的值进行随机播放,则可以使用此代码段
double[][] data = {{1.1, 1.2}, {2.1, 2.2}, {3.1, 3.2}};
Random random = new Random();
int numberOfValues = data.length * data[0].length;
for (int i = numberOfValues - 1; i > 0; i--) {
int index = random.nextInt(i);
int row = i / data[0].length;
int column = i - row * data[0].length;
int randomRow = index / data[0].length;
int randomColumn = index - randomRow * data[0].length;
double temp = data[row][column];
data[row][column] = data[randomRow][randomColumn];
data[randomRow][randomColumn] = temp;
}
System.out.println("toArray = " + Arrays.deepToString(data));
示例输出
toArray = [[2.1, 3.2], [2.2, 1.2], [1.1, 3.1]]
我们的想法是将所有条目视为一个平面数组[2.1, 3.2, 2.2, 1.2, 1.1, 3.1]
,并从最后一个索引开始回到第二个索引。
0 <= index < 5
并交换数据[index]和数据[5] 0 <= index < 4
并交换数据[index]和数据[4]