/ / Random Array Repeating - Java, Arrays, zufällig

Random Array Repeating - Java, Arrays, zufällig

Also erstelle ich ein Penny-Spiel, bei dem der Code zufällig 5 Zellen auswählt. Ich habe es so eingestellt:

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

Das Problem ist, dass manchmal die zufälligen Zellen wiederholt werden.

Wie kann ich dafür sorgen, dass eine zufällige Array-Zelle nicht wiederholt oder erneut ausgewählt werden kann?

Antworten:

1 für die Antwort № 1

Abhängig von Ihren genauen Anforderungen ist hier eine 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);
}

Dadurch wird sichergestellt, dass die Liste der Pennys funktioniertkeine Werte wiederholen lassen. Wenn Sie stattdessen keine Zellindizes wiederholen möchten, wird dies etwas komplizierter, es kann jedoch eine ähnliche Technik verwendet werden.

Ich habe mir die Freiheit genommen, Ihr 2D-Array in umzubenennen pArray Java-Namenskonventionen zu befolgen.


1 für die Antwort № 2
  1. Erstellen Sie eine Liste mit 25 Ganzzahlen (Sie haben ein 5x5-Raster?) Und initialisieren Sie es inkrementell

    List<Integer> indexes = new ArrayList<>();
    for (int i = 0; i < 25; i++)
    indexes.add(i);
    
  2. Mische es

    Collections.shuffle(indexes);
    
  3. (Optionaler Schritt, nicht erforderlich) Verkleinern Sie die Liste, da Sie nur die ersten 5 Indizes benötigen

    indexes.subList(5, indexes.size()-1).clear(); //removing from index 5 to 24
    
  4. Konvertieren Sie jeden dieser Indizes in Zeilen-Spalten-Koordinaten (Beispiel: Index 8 entspricht dem Element in der 2. Zeile, 3. Spalte) und speichern Sie den entsprechenden Penny

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

Ich habe es nicht getestet, aber ich denke, die Idee ist ziemlich einfach. Mit diesem Ansatz können Sie vermeiden, eine hässliche while-Schleife zu implementieren, um zu überprüfen, ob Sie bereits einen Penny ausgewählt haben.


Alternative:

Speichern Sie Ihre Pfennige in einer 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]);

Und mische es

Collections.shuffle(pickedPennies);

Die ersten 5 Elemente der Liste sind Ihre zufälligen Pfennige


0 für die Antwort № 3

Alles, was Sie tun müssen, ist sicherzustellen, dass dieKombinationen (a, b), (c, d) usw. sind einzigartig, so dass Ihre Pennies auch einzigartig sind. Eine sehr einfache Methode, um eindeutige Paare in einem 5x5-Cent-Array zu erhalten (was Sie meines Erachtens erreichen möchten):

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