Java 随机移动';a';在二维阵列中,在跟踪通过每个点的时间数的同时,将其移动到指定位置
我有一个2D数组(比如double[10][10]),其中包含一些1.0和10.0,其余的都是0.0。我试图通过循环这个数组来找到1.0(起点),从那里随机地(使用random.nextInt(4))向上、向下、向左或向右移动它,直到它达到10.0。我创建了一个emptyArray来跟踪它经过每个点的时间(或者至少我认为我做到了)。编译时没有出现任何问题,但在尝试将其显示到框架中时没有得到任何结果。你知道我哪里做错了或是失踪了吗Java 随机移动';a';在二维阵列中,在跟踪通过每个点的时间数的同时,将其移动到指定位置,java,arrays,loops,random,Java,Arrays,Loops,Random,我有一个2D数组(比如double[10][10]),其中包含一些1.0和10.0,其余的都是0.0。我试图通过循环这个数组来找到1.0(起点),从那里随机地(使用random.nextInt(4))向上、向下、向左或向右移动它,直到它达到10.0。我创建了一个emptyArray来跟踪它经过每个点的时间(或者至少我认为我做到了)。编译时没有出现任何问题,但在尝试将其显示到框架中时没有得到任何结果。你知道我哪里做错了或是失踪了吗 {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}
{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}
{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}
{0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0}
{0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0}
{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}
{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}
{0.0,10.0,10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}
{0.0,10.0,10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}
{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}
二维阵列的示例
double[][] getPath(double[][] dataIn) {
double[][] emptyArray = new double[dataIn.length][dataIn[0].length];
double[][] drunkLoc = new double[dataIn.length][dataIn[0].length];
for (int i = 0; i < dataIn.length; i++) {
for (int j = 0; j < dataIn[i].length; j++) {
if (dataIn[i][j] == 1.0) {
double drunkHome = 10.0;
drunkLoc[i][j] = dataIn[i][j];
do {
int dir = getDirection();
switch(dir) {
case 0:
if ((i > 0) && (j > 0)) {
drunkLoc[i][j] = drunkLoc[i-1][j];
double value = emptyArray[i][j];
emptyArray[i][j] = value + 1;
emptyArray[i][j] = (255<<24) | (255<<16) | (255<<8) | 255;
} else {
break;
}
break;
case 1:
if ((i > 0) && (j > 0)) {
drunkLoc[i][j] = drunkLoc[i][j-1];
double value = emptyArray[i][j];
emptyArray[i][j] = value + 1;
emptyArray[i][j] = (255<<24) | (255<<16) | (255<<8) | 255;
} else {
break;
}
break;
case 2:
if ((i > 0) && (j > 0)) {
drunkLoc[i][j] = drunkLoc[i+1][j];
double value = emptyArray[i][j];
emptyArray[i][j] = value + 1;
emptyArray[i][j] = (255<<24) | (255<<16) | (255<<8) | 255;
} else {
break;
}
break;
case 3:
if ((i > 0) && (j > 0)) {
drunkLoc[i][j] = drunkLoc[i][j+1];
double value = emptyArray[i][j];
emptyArray[i][j] = value + 1;
emptyArray[i][j] = (255<<24) | (255<<16) | (255<<8) | 255;
} else {
break;
}
break;
default:
}
} while (drunkLoc[i][j] != drunkHome);
}
}
}
return emptyArray;
}
double[]getPath(double[]dataIn){
double[]emptyArray=new double[dataIn.length][dataIn[0.length];
double[]loc=新的double[dataIn.length][dataIn[0.length];
for(int i=0;i0)和&(j>0)){
醉鬼[i][j]=醉鬼[i-1][j];
双值=空数组[i][j];
空数组[i][j]=值+1;
emptyArray[i][j]=(255好的,供您学习,以下是一些示例代码,它将为您提供您正在寻找的答案(从(XPO,YPO)到(destX,destY)在一个尺寸为PendDimension x PendDimension的“板”上的移动次数:
int penDimension = 10;
int destX = 2;
int destY = 2;
int xpos = 5;
int ypos = 5;
// Add this to keep track of no moves through each square
int[][] moveCounts = new int[penDimension][penDimension];
Random r = new SecureRandom();
long noMoves = 0;
while (xpos != destX || ypos != destY) {
switch (r.nextInt(4)) {
case 0 : xpos++; break;
case 1 : xpos--; break;
case 2 : ypos++; break;
case 3 : ypos--; break;
}
if (xpos < 0) xpos = 0;
if (ypos < 0) ypos = 0;
if (xpos > penDimension) xpos = penDimension;
if (ypos > penDimension) ypos = penDimension;
noMoves++;
// Add this to keep track of no moves through each square
moveCounts[ypos][xpos]++;
}
System.out.println("Number of moves: " + noMoves);
我只是像上面那样写,因为我觉得这样更容易理解
您也可以编写“new-SecureRandom()”,而不是编写“new-Random()”,这可能是您所学的内容。但是SecureRandom的质量要高得多(但速度较慢)随机数生成器。通常,在编写重复生成大量随机数的“模拟”时,最好避免使用标准的随机类,并使用更高质量的生成器。我还不太清楚您在这里实际要做什么,但您是否在每次迭代时都登录了数组ion并将输出与预期结果进行比较?顺便说一句,您的条件“(i>0)和(j>0)”对于dirs 1-3是错误的。加上带有移位的奇异行(为什么不写“-1”?!?)将始终覆盖“值+1”我想这不是你想要的。嗨@NeilCoffey,我正在尝试获取数组的返回值,其中包含从“1.0”到“10.0”的随机过程中“a”经过的时间数。我是java新手,所以我不太明白你所说的“在每次迭代中记录数组的if”是什么意思,你能解释一下吗。谢谢。(I>0)&&(j>0)4种可能情况中的每种情况的一部分都是为了防止数组中的“a”用完。这是正确的方法吗?要注销数组的内容,请执行System.out.println(Arrays.deepToString(array));在使用“while”命令行之前,在每个数组上调用此命令,看看它是什么样子。很好,我会尝试一下,非常感谢@Neil Coffey。但我很好奇,如果我使用上面的方法,是否有一种方法可以计算“a”通过每个点(而不是目的地)的时间数?这意味着我必须记录麻木时间“a”在到达目的地之前经过每个空间。有什么建议吗?我如何获得数组中指定单元格的x,y?例如,如果我想获得第一个“1.0”的x,y,我该怎么做?我想使用For循环遍历行和列,设置一个if条件来匹配x,y='1.0'。然后我被卡住了,如何返回x和y,但不返回x,y中的值“1.0”?如果确实需要,请创建一个数组,移动位置后,在该位置增加值。我将更新代码。
xpos = Math.max(0, xpos - 1);