/ / Random Array Repeating - java, tablice, losowe

Powtarzanie losowe tablic - java, tablice, losowe

Tworzę więc grę z pieniędzmi, w której kod losowo wybierze 5 komórek. Ustawiam tak:

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

Problem polega na tym, że czasami losowe komórki są powtarzane.

Jak mogę to zrobić, aby losowa komórka macierzy nie mogła się powtarzać ani wybierać ponownie?

Odpowiedzi:

1 dla odpowiedzi № 1

W zależności od dokładnych wymagań jest tutaj opcja:

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

Zapewni to, że lista groszy manie powtarzaj żadnych wartości. Jeśli zamiast tego nie chcesz powtarzać żadnych indeksów komórkowych, staje się to nieco bardziej skomplikowane, ale można zastosować podobną technikę.

Wykorzystałem swobodę zmiany nazwy twojej tablicy 2D pArray przestrzegać konwencji nazewnictwa Java.


1 dla odpowiedzi nr 2
  1. Utwórz listę 25 liczb całkowitych (masz siatkę 5x5, prawda?) I inicjuj ją stopniowo

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

    Collections.shuffle(indexes);
    
  3. (Krok opcjonalny, nie konieczny) Zmniejsz listę, ponieważ potrzebujesz tylko pierwszych 5 indeksów

    indexes.subList(5, indexes.size()-1).clear(); //removing from index 5 to 24
    
  4. Konwertuj każdy z tych indeksów na współrzędne wiersz-kolumna (na przykład: indeks 8 odpowiada elementowi w 2. rzędzie, 3. kolumnie) i zapisz odpowiedni grosz

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

Nie przetestowałem tego, ale myślę, że pomysł jest dość prosty. Dzięki takiemu podejściu można uniknąć wdrożenia brzydkiej pętli while, aby sprawdzić, czy już wybrałeś grosz.


Alternatywny:

Przechowuj swoje grosze na liście

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

I potasuj to

Collections.shuffle(pickedPennies);

Pierwsze 5 elementów listy to twoje losowe grosze


0 dla odpowiedzi № 3

Wszystko, co musisz zrobić, to upewnić się, żekombinacje (a, b), (c, d) itp. są unikalne, dzięki czemu Twoje grosze są również wyjątkowe. Bardzo prostym sposobem na uzyskanie unikalnych par w tablicy grosza 5x5 (co myślę, że próbujesz osiągnąć) jest:

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