Как мне завершить этот вопрос с 2-мерным массивом в Java? - PullRequest
0 голосов
/ 14 ноября 2010

Привет, ребята, я работаю над книгой Введение в программирование на Java и одним из упражнений является следующее:

Эмпирическая проверка шаффла .Проведите вычислительные эксперименты, чтобы убедиться, что наш код тасования работает так, как рекламируется.Напишите программу ShuffleTest, которая принимает аргументы командной строки M и N, выполняет N перемешиваний массива размера M, который инициализируется с [i] = i перед каждым перемешиванием, и печатает таблицу M-by-M так, чтобы строкадает количество раз, когда я оказался в положении j для всех j.Все записи в массиве должны быть близки к N / M.

Теперь этот код просто выводит блок нулей ...

public class ShuffleTest2 {
  public static void main(String[] args) {
    int M = Integer.parseInt(args[0]);
    int N = Integer.parseInt(args[1]); 
    int [] deck = new int [M];

    for (int i = 0; i < M; ++i)
      deck [i] = i;

    int [][] a = new int [M][M];

    for (int i = 0; i < M; i++) {
      for (int j = 0; j < M; j++) {
        a[i][j] = 0 ;

        for(int n = 0; n < N; n++) {
          int r = i + (int)(Math.random() * (M-i));
          int t = deck[r];
          deck[r] = deck[i];
          deck[i] = t;

          for (int b = 0; b < N; b++)
          {
            for (int c = 0; c < M; c++)
              System.out.print(" " + a[b][c]);
            System.out.println();
          }
        }
      }
    }
  }
}

Что я делаю не так?: (

Спасибо

1 Ответ

0 голосов
/ 14 ноября 2010

Значит, это как история?Поскольку вы сейчас, он всегда заполнен нулями, как вы инициализировали, вы никогда не назначаете его!После «тасования» для цикла необходимо установить

A[i][POSITION] = CARD_VALUE

. Это означает, что после i-го тасования карта CARD_VALUE находится в положении POSITION.Я не хочу давать вам все подробности, но потребуется еще один цикл for, и вложенный цикл for для печати должен быть независимым от любого другого цикла, возникающего, когда все остальное сделано.

Похоже, у вас есть несколько вещей, касающихся циклов for, которые вы должны внимательно просмотреть.Отслеживайте ход выполнения программы вручную или с помощью отладчика, и вы заметите, что некоторые из этих фигурных скобок и блоков кода необходимо переместить.

- ПОПРОБУЙТЕ ЭТО -

public class ShuffleTest2 {

  public static void main(String[] args) {
    int M = Integer.parseInt(args[0]);
    int N = Integer.parseInt(args[1]); 
    int [] deck = new int [M];

    int [][] a = new int [M][M]; 

    for (int i = 0; i < M; i++) {  //initialize a to all zeroes
      for (int j = 0; j < M; j++) {
        a[i][j] = 0 ; 
      }
    }

    for(int i = 0; i < N; i++)   //puts the deck in order, shuffles it, and records. N times
    {
        for (int j = 0; j < M; j++)  //order the deck
          deck[j] = j;

        for(int j = 0; j < M; j++) {       //shuffle the deck (same as yours except counter name)
          int r = j + (int)(Math.random() * (M-j));
          int t = deck[r];
          deck[r] = deck[j];
          deck[j] = t;
        }

       for(int j = 0; j < M; j++)   //record status of this deck as described
       {
           int card_at_j = deck[j];  //value of card in position j
           a[card_at_j][j]++;        //tally that card_at_j occured in position j
       }
    }  //big loop ended

    for (int b = 0; b < M; b++)  //print loop.  a is MxM, so limit of N was wrong.
    {
        for (int c = 0; c < M; c++)
        {
           System.out.print(" " + a[b][c]);
           System.out.println();
        }
    }  //print loop ended
  }  //main() ended
 } //class ended
...