0

私はこの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,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}

2D配列のサンプル。

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

さらに詳しい説明が必要な場合はお知らせください。私の2番目の投稿だけなので、まだ私の質問のテクニックを学んでいます。前もって感謝します。

4

1 に答える 1

1

OK、勉強するために、ここにあなたが探している答えを与えるいくつかのサンプルコードがあります(penDimension xである「ボード」上で(xpos、ypos)から(destX、destY)に到達するための移動の数)サイズの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);

わかりやすいと思ったので、上と同じように書きました。

「newSecureRandom()」を書く代わりに、「new Random()」を書くこともできます。これはおそらくあなたが学んだことです。ただし、SecureRandomは、はるかに高品質の(ただし低速の)乱数ジェネレーターです。一般に、多数の乱数を繰り返し生成する「シミュレーション」を作成する場合は、標準のRandomクラスを避け、より高品質のジェネレーターを使用することをお勧めします。

于 2012-07-02T10:45:38.133 に答える