/ / Répétition aléatoire de tableaux - Java, tableaux, aléatoires

Répétition de tableau aléatoire - java, tableaux, aléatoire

Je crée donc un jeu de penny où le code choisira au hasard 5 cellules. Je le mets comme ça:

    int a = gen.nextInt(5);
int b = gen.nextInt(5);
int c = gen.nextInt(5);
int d = gen.nextInt(5);
int e = gen.nextInt(5);
int f = gen.nextInt(5);
int g = gen.nextInt(5);
int h = gen.nextInt(5);
int i = gen.nextInt(5);
int j = gen.nextInt(5);
int penny1 = Parray[a][b];
int penny2 = Parray[c][d];
int penny3 = Parray[e][f];
int penny4 = Parray[g][h];
int penny5 = Parray[i][j];

Le problème est que parfois les cellules aléatoires sont répétées.

Comment puis-je faire en sorte qu'une cellule de tableau aléatoire ne puisse pas être répétée ou choisie à nouveau?

Réponses:

1 pour la réponse № 1

Selon vos besoins précis, voici une option:

    List<Integer> pennies = new ArrayList<>(NUMBER_OF_PENNIES);
for (int p = 0; p < NUMBER_OF_PENNIES; p++) {
Integer penny;
do {
int a = gen.nextInt(5);
int b = gen.nextInt(5);
penny = pArray[a][b];
} while (pennies.contains(penny));
pennies.add(penny);
}

Cela garantira que la liste des pièces de un centaucune valeur ne doit être répétée. Si, à la place, vous ne voulez pas que les indices de cellule soient répétés, cela devient un peu plus compliqué, mais une technique similaire peut être utilisée.

J'ai pris la liberté de renommer votre réseau 2D en pArray pour suivre les conventions de dénomination Java.


1 pour la réponse № 2
  1. Créez une liste de 25 entiers (vous avez une grille 5x5 non?) Et initialisez-la progressivement

    List<Integer> indexes = new ArrayList<>();
    for (int i = 0; i < 25; i++)
    indexes.add(i);
    
  2. Mélangez-le

    Collections.shuffle(indexes);
    
  3. (Étape facultative, pas nécessaire) Réduisez la liste car vous n'avez besoin que des 5 premiers index

    indexes.subList(5, indexes.size()-1).clear(); //removing from index 5 to 24
    
  4. Convertissez chacun de ces index en coordonnées ligne-colonne (par exemple: l'index 8 correspond à l'élément dans la 2ème ligne, la 3ème colonne) et stockez le sou correspondant

    List<Integer> pickedPennies = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
    int row = indexes.get(i) / 5;
    int col = indexes.get(i) % 5;
    pickedPennies.add(Parray[row][col]);
    }
    

Je ne l'ai pas testé mais je suppose que l'idée est assez simple. Avec cette approche, vous pouvez éviter d'implémenter une boucle while laide pour vérifier si vous avez déjà choisi un sou.


Alternative:

Stockez vos pièces dans une liste

List<Integer> pickedPennies = new ArrayList<>();
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
pickedPennies.add(Parray[i][j]);

Et mélangez-le

Collections.shuffle(pickedPennies);

Les 5 premiers éléments de la liste sont vos pièces de monnaie aléatoires


0 pour la réponse № 3

Il vous suffit de vous assurer que leles combinaisons (a, b), (c, d), etc. sont uniques afin que vos pièces soient également uniques. Un moyen très simple d'obtenir des paires uniques dans un tableau de 5x5 penny (ce que je pense que vous essayez d'atteindre) est:

public static boolean checkIfComboExists(ArrayList<int[]> map,int[] combo){
for(int i = 0; i < map.size(); i++){
int[] elem = map.get(i);
if(elem[0] == combo[0] && elem[1] == combo[1]){
return true;
}
}
return false;
}

public static void main(String[] args){

int[][] Parray = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};
Random gen = new Random();

ArrayList<int[]> map = new ArrayList<int[]>();
while (map.size() < 5){
int x = gen.nextInt(5);
int y = gen.nextInt(5);
int[] combo = {x,y};
if(!checkIfComboExists(map,combo)){
map.add(combo);
}
}

int newpenny1 = Parray[map.get(0)[0]][map.get(0)[1]];
int newpenny2 = Parray[map.get(1)[0]][map.get(1)[1]];
int newpenny3 = Parray[map.get(2)[0]][map.get(2)[1]];
int newpenny4 = Parray[map.get(3)[0]][map.get(3)[1]];
int newpenny5 = Parray[map.get(4)[0]][map.get(4)[1]];

System.out.println(newpenny1);
System.out.println(newpenny2);
System.out.println(newpenny3);
System.out.println(newpenny4);
System.out.println(newpenny5);
}