/ De matriz aleatória / aleatória - java, matrizes, aleatória

Random Array Repeating - java, matrizes, aleatório

Então, eu estou criando um jogo de moeda de um centavo onde o código escolherá aleatoriamente 5 células. Eu defini assim:

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

O problema é que, às vezes, as células aleatórias são repetidas.

Como posso fazer com que uma célula de matriz aleatória não possa ser repetida ou escolhida novamente?

Respostas:

1 para resposta № 1

Dependendo dos requisitos exatos, aqui está uma opção:

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

Isso garantirá que a lista de moedas de um centavonão tem nenhum valor repetido. Se, em vez disso, você não deseja repetir nenhum índice de células, fica um pouco mais complicado, mas uma técnica semelhante pode ser usada.

Tomei a liberdade de renomear sua matriz 2D para pArray para seguir as convenções de nomenclatura Java.


1 para resposta № 2
  1. Crie uma lista de 25 números inteiros (você tem uma grade de 5x5, certo?) E inicialize-a gradualmente

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

    Collections.shuffle(indexes);
    
  3. (Etapa opcional, não é necessária) Reduza a lista, pois você precisa apenas dos 5 primeiros índices

    indexes.subList(5, indexes.size()-1).clear(); //removing from index 5 to 24
    
  4. Converta cada um desses índices em coordenadas de coluna de linha (por exemplo: o índice 8 corresponde ao elemento na segunda linha, terceira coluna) e armazene o centavo correspondente

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

Não testei, mas acho que a idéia é bem fácil. Com essa abordagem, você pode evitar implementar um loop while feio para verificar se você já escolheu um centavo.


Alternativa:

Armazene seus centavos em uma lista

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

E embaralhe

Collections.shuffle(pickedPennies);

Os 5 primeiros elementos da lista são seus centavos aleatórios


0 para resposta № 3

Tudo que você precisa fazer é garantir que oas combinações (a, b), (c, d) etc. são únicas, de modo que seus centavos também são únicos. Uma maneira muito simples de obter pares únicos em uma matriz de 5 x 5 centavos (que é o que eu acho que você está tentando alcançar) é:

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