【问题标题】:Randomly move 'a' in an 2D array to a specify location while keeping track of the number of time it pass through each point将二维数组中的“a”随机移动到指定位置,同时跟踪它通过每个点的次数
【发布时间】:2012-07-02 09:49:42
【问题描述】:

我有这个二维数组(比如 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,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;
}

如果您需要更多说明,请告诉我。只有我的第二个帖子,所以还在学习我的提问技巧。提前致谢。

【问题讨论】:

  • 我还没有完全理解您在这里实际尝试执行的操作,但是您是否在每次迭代时都登录了数组并将输出与您期望发生的结果进行了比较?
  • 顺便说一下,您的条件“(i > 0)&&(j > 0)”对于 dirs 1-3 是错误的。加上变化的奇怪线条(为什么不写“-1”?!?)总是会覆盖“值+1”,我认为这不是你想要的。
  • 嗨@NeilCoffey,我正在尝试返回一个数组,其中包含“a”在随机从“1.0”到“10.0”时经过的次数。我是Java新手,所以不太明白“在每次迭代中记录数组是否记录”是什么意思,请您解释一下。谢谢。
  • 哦,(i>0)&&((j>0) 4 种可能情况中的每一种情况都是为了防止 'a' 用完数组。这是正确的方法吗?
  • 要注销数组的内容,请执行 System.out.println(Arrays.deepToString(array));就在你的'while'行之前,在每个数组上调用它,看看它是什么样子的。

标签: java arrays loops random


【解决方案1】:

好的,供您学习,这里有一些示例代码,可以为您提供您正在寻找的答案(在“棋盘”上从 (xpos,ypos) 到 (destX,destY) 的移动次数)是 penDimension x penDimension 的大小:

        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);

除了执行 ++ 或 -- 然后检查边界,您还可以编写(在现实生活中可能会编写)例如:

xpos = Math.max(0, xpos - 1);

我只是像上面那样写它,因为我认为它更容易理解。

除了编写“new SecureRandom()”之外,您还可以编写“new Random()”,这可能是您所学的。但是 SecureRandom 是一个质量更高(但速度更慢)的随机数生成器。一般来说,在编写反复生成大量随机数的“模拟”时,最好避免使用标准的 Random 类并使用更高质量的生成器。

【讨论】:

  • 很好,我会试试这个,非常感谢@Neil Coffey。但是我很好奇如果我使用上面的这种方法,有没有办法可以计算“a”通过目的地以外的每个单独点的时间?这意味着我必须记录“a”在到达目的地之前通过每个空间的次数。
  • 任何建议如何获取数组中指定单元格的 x,y?例如,如果我想获得第一个“1.0”的 x,y,我该怎么做?我虽然使用 for 循环遍历行和列,但设置一个 if 条件以匹配 x,y == '1.0'。之后我被卡住了,如何返回 x 和 y 而不是 x,y 中的值 '1.0'?
  • 如果您确实需要,则创建一个数组,并在移动位置后,增加该位置的值。我会更新代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多