3
votes

Comment générer une table matricielle 2D avec des nombres non répétitifs?

Comment générer un tableau de tableau 2D 4X4 avec chaque élément différent?

Voici mon code:

public class Game {
public static void main(String[] args) {
    int gameboard[][] = new int[4][4];
    for (int row=0; row < gameboard.length; row++) {
        for (int col=0; col < gameboard[row].length; col++) {
            gameboard[row][col] = ((int)(1+Math.random() * 16));
            System.out.printf("%-4d",gameboard[row][col]);
        }
        System.out.println();
        }
      }

}


0 commentaires

3 Réponses :


0
votes

Vous pouvez d'abord utiliser un Set pour éviter les doublons, puis une List pour y accéder facilement

Set<Integer> set = new LinkedHashSet<>();
int gameboard[][] = new int[4][4];

while(set.size() != 4*4){
    set.add((int)(1+Math.random() * 16));
}

List<Integer> list = new ArrayList<>(set);

for (int row=0; row < gameboard.length; row++) {
    for (int col=0; col < gameboard[row].length; col++) {
        gameboard[row][col] = list.get(row*gameboard.length + col);
        System.out.printf("%-4d",gameboard[row][col]);
    }
    System.out.println();
    }
  }


2 commentaires

cela fonctionne, mais les nombres générés semblent toujours être 1,2,3,4,5, ... 15 au lieu d'être générés aléatoirement


@ user10947891 oups oui, besoin de LinkedHashSet pour conserver l'ordre d'insertion



0
votes

Il vous suffit de mettre un contrôle après comme:

 int a == gameboard[row][col];

 for (int row=0; row < gameboard.length; row++) {
     for (int col=0; col < gameboard[row].length; col++) {
             gameboard[row][col] = ((int)(1+Math.random() * 16));
             if(gameboard[row][col] == a){
                 col = col - 1; 
             }
     }
 }


0 commentaires

0
votes

Solution 1:

List<Integer> myList = IntStream.range(1, 17).boxed().collect(Collectors.toList());
Collections.shuffle(myList);

for (int row = 0; row < gameboard.length; row++) {
    for (int col = 0; col < gameboard[row].length; col++) {
        gameboard[row][col] = myList.get(row * gameboard.length + col);
        System.out.printf("%-4d", gameboard[row][col]);
    }
    System.out.println();
}

Ici, à chaque itération, nous vérifions si le nombre aléatoire généré est présent dans l'ensemble . S'il est présent, nous bouclons jusqu'à ce que nous obtenions un nombre aléatoire différent qui n'est pas présent dans l'ensemble.


Solution 2:

public static void main(String[] s1) throws Exception {
    int gameboard[][] = new int[4][4];
    Set<Integer> mySet = new HashSet<>();

    for (int row = 0; row < gameboard.length; row++) {
        for (int col = 0; col < gameboard[row].length; col++) {
            int randNum = (int) (1 + Math.random() * 16);

            while (mySet.contains(randNum)) {
                randNum = (int) (1 + Math.random() * 16);
            }
            mySet.add(randNum);

            gameboard[row][col] = randNum;
            System.out.printf("%-4d", gameboard[row][col]);
        }
        System.out.println();
    }
}

Ici, nous générons une liste de nombres, puis nous la mélangeons en utilisant Collections.shuffle () . Nous parcourons maintenant le tableau multidimensionnel et attribuons les valeurs de la liste au tableau.


1 commentaires

Veuillez également envisager de voter pour la réponse. Que dois-je faire lorsque quelqu'un répond à ma question?