Random sem repetição

Olá, boa tarde.

Gostaria de saber como faço para que os números n se repitam consecutivamente neste código. pois eles podem ate se repetir, mas n em seguida.

double n = 1 + Math.random() * (11 - 1);
int valor = (int) n;

    String f1 = "<html>xxxxxxxxxxx</html>";
    String f2 = "<html>xxxxxxxxxxx</html>";
    String f3 = "<html>xxxxxxxxxxx</html>";
    String f4 = "<html>xxxxxxxxxxx</html>";
    String f5 = "<html>xxxxxxxxxxx</html>";
    String f6 = "<html>xxxxxxxxxxx</html>";
    String f7 = "<html>xxxxxxxxxxx</html>";
    String f8 = "<html>xxxxxxxxxxx</html>";
    String f9 = "<html>xxxxxxxxxxx</html>";
    String f10 = "<html>xxxxxxxxxx</html>";
    String f11 = "";
    
    String res1 = (valor == 1)?f1:f11;
    String res2 = (valor == 2)?f2:f11;
    String res3 = (valor == 3)?f3:f11;
    String res4 = (valor == 4)?f4:f11;
    String res5 = (valor == 5)?f5:f11;
    String res6 = (valor == 6)?f6:f11;
    String res7 = (valor == 7)?f7:f11;
    String res8 = (valor == 8)?f8:f11;
    String res9 = (valor == 9)?f9:f11;
    String res10 = (valor == 10)?f10:f11;
    String res11 = (valor == 11)?f10:f2;
    
    lblMsg.setText((res1) + (res2) + (res3) + (res4) + (res5) + (res5) + (res7) + (res8) + (res9) + (res10) + (res11));

valeu, abs!

Repetir em seguida? Como assim…? Não entendi bem o problema, já que números pseudoaleatórios não se repetem em seguida (e essa é a ideia). Mesmo porque a semente (seed) é baseada no relógio da máquina. Poderia explicar melhor o que pretende?

É q às vezes o aleatório escolhe o mesmo número 2 ou 3 vezes consecutivas… queria q isso n ocorresse, q sempre fosse um outro número, mesmo q, eventualmente, se repitam em outro momento.

Ah sim, agora entendi. Nesse caso você pode armazená-los em um array e sempre testar. Se gerar igual a que esteja no array, mande gerar novamente até que o número seja diferente. Uma alternativa também é usar uma versão empacotada do int (Integer) como aqui: Usando o Contains.

1 curtida

A resposta simples é:

Cada vez que vc gera um número, vc o salva, quando um novo número for gerado, vc o compara com aquele que vc salvou, se for igual, vc gera outro, se for diferente, vc guarda o novo número e segue a execução.

Aqui está um exemplo:

public class Main {
    public static void main(String[] args) {
        int savedNumber = Integer.MAX_VALUE;

        for (int i = 0; i < 20; i++) {
            int valor;

            do valor = (int) (1 + Math.random() * (11 - 1));
            while (valor == savedNumber);

            savedNumber = valor;

            System.out.println(valor);
        }
    }
}

Este código guarda apenas o último número gerado. Abaixo está uma solução mais robusta onde vc pode escolher a quantidade de números guardados:

import java.util.ArrayDeque;
import java.util.Collections;
import java.util.Queue;

public class Main {
    public static void main(String[] args) {
        final int MAX_SAVED_NUMBERS = 3;

        Queue<Integer> savedNumbers = new ArrayDeque<>(Collections.nCopies(MAX_SAVED_NUMBERS, Integer.MAX_VALUE));

        for (int i = 0; i < 20; i++) {
            int valor;

            do valor = (int) (1 + Math.random() * (11 - 1));
            while (savedNumbers.contains(valor));

            if (savedNumbers.size() == MAX_SAVED_NUMBERS) savedNumbers.remove();

            savedNumbers.add(valor);

            System.out.println(valor);
        }
    }
}

Valeu!!! MUITO obrigado.