Preciso de ajuda java/android studio/array/random

Estou criando um app, uma das telas tem 25 botões, cada botão precisa receber um valor aleatorio do array porem, eles não podem se repetir, e eu não consigo fazer isso, sou noob e estou começando a aprender java, já procurei aqui e achei códigos parecidos mas não achei o que queria, eu preciso comparar os botões pra não se repetirem.

o que eu estou fazendo é um tipo e jogo que gera 25 botões aleatorios com as letras do array e depois que gerou as letras nos botões, tem outro valor em cima que pega as 25 posições escolhidas e gera outro aleatorio nessa imagem perguntando pro user qual botão é igual a ela, ao clicar no botão correto a imagem muda e assim por diante até acertar todas.

https://i.imgur.com/NSB7iyT.png

aqui está o código “completo” que eu estou batendo cabeça pra fazer até agora.

package com.example.kana3;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.Random;

public class Kanas extends AppCompatActivity {
private Button hajimeruBotao;

private Button
        b1,b2,b3,b4,b5,
        b6,b7,b8,b9,b10,
        b11,b12,b13,b14,b15,
        b16,b17,b18,b19,b20,
        b21,b22,b23,b24,b25;

private String[] hiraArray = {"あ","い","う","え","お"};
//,"か","き","く","け","こ"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_kanas);

    b1 = findViewById(R.id.botao1);
    b2 = findViewById(R.id.botao2);
    b3 = findViewById(R.id.botao3);
    b4 = findViewById(R.id.botao4);
    b5 = findViewById(R.id.botao5);
    b6 = findViewById(R.id.botao6);
    b7 = findViewById(R.id.botao7);
    b8 = findViewById(R.id.botao8);
    b9 = findViewById(R.id.botao9);
    b10 = findViewById(R.id.botao10);
    b11 = findViewById(R.id.botao11);
    b12 = findViewById(R.id.botao12);
    b13 = findViewById(R.id.botao13);
    b14 = findViewById(R.id.botao14);
    b15 = findViewById(R.id.botao15);
    b16 = findViewById(R.id.botao16);
    b17 = findViewById(R.id.botao17);
    b18 = findViewById(R.id.botao18);
    b19 = findViewById(R.id.botao19);
    b20 = findViewById(R.id.botao20);
    b21 = findViewById(R.id.botao21);
    b22 = findViewById(R.id.botao22);
    b23 = findViewById(R.id.botao23);
    b24 = findViewById(R.id.botao24);
    b25 = findViewById(R.id.botao25);

    hajimeruBotao = findViewById(R.id.hajimeruBotao);

    hajimeruBotao.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            b1.setText(hiraArray[random()]);
            b2.setText(hiraArray[random()]);
            b3.setText(hiraArray[random()]);
            b4.setText(hiraArray[random()]);
            b5.setText(hiraArray[random()]);

            int rand1 = random();
            int rand2 = random();
            int rand3 = random();
            int rand4 = random();
            int rand5 = random();

            b1.setText(hiraArray[rand1]);
            if (rand2 == rand1)
            {
                b2.setText(hiraArray[random()]);
            }
            if (rand3 == rand2) {
                b3.setText(hiraArray[random()]);
            }
            if (rand4 == rand3);{
                b4.setText(hiraArray[random()]);
            }
            if (rand5 == rand4) {
                b5.setText(hiraArray[random()]);
            }



        }
    });

}
public int random(){
    int random = new Random().nextInt(hiraArray.length);
    return random;
}

}

Você chegou a pesquisar por “números aleatórios sem repetição”? :slight_smile:

Tudo bem que a maioria dos tópicos encontrados não dão soluções muito boas (ficam fazendo um loop para verificar se o elemento já existe, ou simplesmente não verificam nada, o que não garante que evitará repetições).

O mais simples e garantido é usar o algoritmo Fisher-Yates (embaralhar o array e pegar a quantidade de itens que você quer, veja aqui um exemplo). Para embaralhar, basta usar Collections.shuffle:

String[] hiraArray = { "あ", "い", "う", "え", "お" };
Collections.shuffle(Arrays.asList(hiraArray));
int i = 0;
b1.setText(hiraArray[i++]);
b2.setText(hiraArray[i++]);
b3.setText(hiraArray[i++]);
b4.setText(hiraArray[i++]);
b5.setText(hiraArray[i++]);

O detalhe é que desta forma você acaba modificando o array. Mas se a ideia é manter o array intacto, você pode criar um outro array de índices e só embaralhar estes índices:

String[] hiraArray = { "あ", "い", "う", "え", "お" };
int[] indices = new int[hiraArray.length]; // índices, com o mesmo tamanho do hiraArray
for (int i = 0; i < indices.length; i++) {
    indices[i] = i;
}
Random rnd = new Random();
// embaralha usando o algoritmo Fisher-Yates
for (int i = indices.length - 1; i > 0; i--) {
    int index = rnd.nextInt(i + 1);
    int tmp = indices[index];
    indices[index] = indices[i];
    indices[i] = tmp;
}
int i = 0;
b1.setText(hiraArray[indices[i++]]);
b2.setText(hiraArray[indices[i++]]);
b3.setText(hiraArray[indices[i++]]);
b4.setText(hiraArray[indices[i++]]);
b5.setText(hiraArray[indices[i++]]);

Infelizmente Collections.shuffle não funciona para tipos primitivos, mas como você pode ver, não é tão complicado assim implementar o Fisher-Yates.

Desta forma, eu embaralho somente os índices e o array hiraArray é mantido intacto.


Outro detalhe é que talvez você devesse usar um array de Button em vez de ter 25 variáveis b1, b2, etc. Aí você poderia fazer um loop simples para carregá-los, veja aqui um exemplo.

1 curtida

como eu disse eu sou noob e sei pouca coisa, mas eu procurei sim só que se eu criar um método como o dos tópicos que eu vi ele só vai chamar o metodo do zero e vai gerar numeros repetidos igual, vou tentar essa tua forma, obrigado.

edit: esse método também não funciona pois eu preciso que os botões sejam individuais pra comparar com outro valor depois, mas já ajudou a eu entender outra coisa valew.