我试图在Java中制作“2维”数组,用1到6之间的随机数填充自己(编辑:我的意思是0和5,正如代码目前所做的那样 - 我的道歉)。但是,我希望这些数字能够在假想的最佳拟合线上“镜像”,就像处理图形一样。例如,如果标记[1] [4]的数字是3.0,我希望[4] [1]的数字也是3.0。我目前处理的代码片段如下所示:它的价值(我在代码中的另一个点将array.length建立为6):
Random random = new Random();
int n = array.length;
double [][] populationArray = new double [n][n];
for (int i=0; i<populationArray.length; i++){
for (int j=0; j<populationArray[i].length; j++) {
populationArray[i][j] = random.nextInt(6);
if (populationArray[i][j] != 0) {
populationArray[j][i] = populationArray[i][j];
}
}
}
for (double[] p : populationArray) {
System.out.println(Arrays.toString(p));
}
目前打印为:
[0.0, 1.0, 2.0, 1.0, 5.0, 2.0]
[1.0, 3.0, 5.0, 1.0, 3.0, 1.0]
[2.0, 5.0, 4.0, 1.0, 4.0, 1.0]
[1.0, 1.0, 1.0, 4.0, 2.0, 2.0]
[5.0, 3.0, 0.0, 2.0, 4.0, 4.0]
[2.0, 1.0, 0.0, 0.0, 4.0, 1.0]
正如你所看到的那些数字反映出来而有些数字没反映出来(我怀疑这些数字纯粹是运气不好),而我正在努力解决这个问题。我会很感激任何建议 - 如果这个问题已在其他地方得到解决,我也会接受一个链接,因为我自己找不到它。
谢谢。
答案 0 :(得分:2)
由于fig=plt.figure(figsize=(15,15))
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax2=fig.add_subplot(2,2,3)
ax2=fig.add_subplot(2,2,4)
ax1.set_xticks(np.arrange(1,5000,500))
ax2.set_xticks(np.arrange(1,5000,500))
ax3.set_xticks(np.arrange(1,5000,500))
ax4.set_xticks(np.arrange(1,5000,500))
仅镜像了不是0的值。如果删除if语句,代码将起作用。
random.nextInt(6)也会生成0(含)和6(不包括)之间的整数,因此生成0,1,2,3,4或5。
所以要生成1-5(含)数,你必须做random.nextInt(5)+1
所以for循环将成为:
if(populationArray[i][j] != 0)
但是我想指出所有的位置都是两次随机值。对于创建单个6x6阵列,差异不会非常明显。但是如果你打算创建更大/更多的数组,我建议你优化你的代码,以避免给数组中的每个点赋值两次。
您可以将for (int i=0; i<populationArray.length; i++){
for (int j=0; j<populationArray[i].length; j++) {
populationArray[i][j] = random.nextInt(5)+1;
populationArray[j][i] = populationArray[i][j];
}
}
更改为j<populationArray[i].length
:
j<=i
答案 1 :(得分:0)
你的问题是这些行
populationArray[i][j] = random.nextInt(6);
if(populationArray[i][j] != 0) {
populationArray[j][i] = populationArray[i][j];
}
如果populationArray[i][j] = random.nextInt(6);
返回0,则不会反映出来。我怀疑你想要populationArray[i][j] = random.nextInt(5)+1;
这将返回1到6之间的随机数。
奖励:您的代码现在可以正常工作,但它实际上是每次写入两次单元格。它会写[1,4]并镜像到[4,1]但是它会继续循环并写入[4,1]并镜像到[1,4]来解决这个问题你需要添加一个检查来查看如果它在写入之前是0。巧合的是,最终只能将你的if语句移动一行。
for (int i=0; i<populationArray.length; i++){
for (int j=i; j<populationArray[i].length; j++) {
populationArray[i][j] = random.nextInt(5)+1;
populationArray[j][i] = populationArray[i][j];
}
}
编辑:根据卢克的评论改变了解决方案。请注意第二个for语句的更改为int j=i
。
答案 2 :(得分:-1)
如果您的阵列变大,您可能希望通过不设置每个元素两次来节省时间。因此,在populationArray[i].length
for (int i=0; i<populationArray.length; i++){
for (int j=0; j<populationArray[i].length-i; j++) {
populationArray[i][j] = random.nextInt(6);
int oppositI = populationArray.length -1 - i;
int oppositJ = populationArray[i].length -1 - j;
populationArray[oppositI][oppositJ] = populationArray[i][j];
}
}
这假设您的populationArray
是一个平方。否则会更复杂......