В Java Самый простой способ добавить неповторяющиеся случайные числа в 2D Array - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь выяснить, какой самый простой способ добавить заполнение этого 2D-массива только недвойственными числами.

Я пытался использовать метод с логическим значением для проверки значения перед его добавлением, если оно уже существует, но я не могу заставить его работать.

int[][] x = new int[R][C];

for (int i = 0; i < x.length; i++) {
    for (int j = 0; j < x[i].length; j++) {
        double z = (Math.random() * ((30 * (j + 1)) - ((30 * j) + 1)) + 1 + ((30 * j) + 1));
        card[i][j] = (int) z;
    }
}

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Лучший способ, который я скажу - это использовать Set структуру данных

int row = 2;
int col = 2;
Set<Set<Integer>> rowSet = new HashSet<>();

 for (int i = 0; rowSet.size() < row; i++) {
        Set<Integer> colSet = new HashSet<>(); 

    for (int j = 0; colSet.size() < col; j++) {
    double x = (Math.random() * ((15 * (j + 1)) - ((15 * j) + 1)) + 1 + ((15 * j) + 1));
    colSet.add((int) x);
  }
   rowSet.add(colSet);
}

и, наконец, преобразовать их в массив

int[][] arr = set.stream()
                     .map(i->i.stream()
                             .mapToInt(Integer::intValue)
                             .toArray())
                     .toArray(int[][]::new);
0 голосов
/ 09 ноября 2019

Вы определенно хотите использовать Random.nextInt(), чтобы получить равномерное распределение ваших int. Скорее всего, вы хотите, чтобы Set отслеживал, какие числа уже были сгенерированы.

int[][] cards = new int[ROW][COL];
Random r = new Random();
Set<Integer> generated = new HashSet<>();
for (int i = 0; i < ROW; i++) {
  for (int j = 0; j < COL; j++) {
    int n;
    do {
      n = r.nextInt();
    } while (generated.contains(n));
    generated.add(n);
    cards[i][j] = n;
  }
}
...