Randômico limitado sem Repetição

8 respostas
A
Oi pessoal, estou com uma dúvida aqui sobre os números aleatórios. O professor passou para a sala um exercício para simular a lotomania, que gera número de 0 a 25 sendo sorteados 15 números que não se podem repetir. A função aleatória eu já sei fazer, porém não sei como não aparecer o repetido. Aqui está a função:
Random random = new Random();  
		  
        for (int i = 0; i < 15; i++) {  
        	int rand = random.nextInt(26) + 0;
            System.out.printf("%d - ", rand);  
        }

ele me traz os 15 números, porém, eu não sei como fazer para que o número não se repita.

8 Respostas

renamed

Não sei se existe uma forma suportada, mas vc pode tentar força bruta…

Random rand= new Random(); Set<Integer> set= new HashSet<Integer>(); while (set.size() < 3) set.add(rand.nextInt(30));

renamed

AH nesse caso ele pegaria 3 numeros diferentes

A

não entendi mto bem o que se passou, o 3 seria o tamanho a ser repetido sem que sejam números iguais?

renamed

Sim, o “3” é o numero de numeros nao repetidos que vc esta querendo

ViniGodoy
O jeito mais fácil é usar o método Collections.shuffle, que embaralha uma lista. Veja:
List<Integer> numeros = new ArrayList<Integer>();

for (int i = 0; i < 26; i++) {
   numeros.add(i);
}

Collections.shuffle(numeros);

System.out.print("Sorteados: ");
for (int i = 0; i < 15; i++) {
   System.out.print(numeros.get(i));
   System.out.print(" ");
}
System.out.println();
pablosaraiva

1 - Coloque as bolas na caixa:

ArrayList<Integer> numeros = new ArrayList<Integer>();
		for (int i = 1; i <= 25; i++) {
			numeros.add(i);
		}

2 - Sorteie as bolas (não esqueça de tirar as usadas da caixa):

Random random = new Random();
		int rand;
		int numeroSorteado;
		
		for (int i = 0; i < 15; i++) {
			rand = random.nextInt(numeros.size());
			numeroSorteado = numeros.get(rand);
			numeros.remove(rand);
			System.out.println(numeroSorteado);
		}

Código completo:

import java.util.ArrayList;
import java.util.Random;


public class TesteRand {

	public static void main(String[] args) {
		ArrayList<Integer> numeros = new ArrayList<Integer>();
		for (int i = 1; i <= 25; i++) {
			numeros.add(i);
		}
		
		Random random = new Random();
		int rand;
		int numeroSorteado;
		
		for (int i = 0; i < 15; i++) {
			rand = random.nextInt(numeros.size());
			numeroSorteado = numeros.get(rand);
			numeros.remove(rand);
			System.out.println(numeroSorteado);
		}
	}
}
pablosaraiva

Ou usar a solução do Vini.

(Quando postei ainda não tinha o post dele).

A diferença é que na implementação dele as “bolas” continuam na caixa, se você perder o ponteiro de iteração, não tem histórico.

Na minha implementação a “caixa” fica só com as “bolas” que sobraram.

Para o caso, acredito que a solução dele seja mais eficiente em velocidade, uso de memória e é também mais simples.

ViniGodoy

Por outro lado, a solução do pablo usa o Random. Se foi a única coisa que seu professor ensinou, use a dele. É uma abordagem mais próxima da realidade de uma loteria, também.

Criado 27 de novembro de 2009
Ultima resposta 27 de nov. de 2009
Respostas 8
Participantes 4