Problema com Randon

7 respostas
B

Boa Noite galera o/

Estou com um pequeno problema com o randon, a principio quero que sejam sorteados números de 8 á 14 sem que eles sejam repetidos, entao fiz a seguinte classe:

public class Randon {
	
	public Randon (){
		
		       int [] myGame = new int[9];
			int valor,novovalor,s,z;
			int j = 0;

				for(s = 1; s <= 7; s++){

				valor = (int) (8 + Math.random() * 7); 
				
				myGame[s] = valor;
				
				novovalor = (int) (8 + Math.random() * 7);

				for(z = 1; z <= 7; z++){
	
					if(myGame1[z] == novovalor){
						
				novovalor = (int) (8 + Math.random() * 7);
				z=0;
				}

				} 
				myGame[s] = novovalor;
				System.out.println(novovalor);// Aqui vocês podem ver os números sorteados

			}
	}
	
	public static void main (String [] args){
		randon frm = new randon ();
	}

}

A principio parece que está a ocorrer tudo bem, porém se vocês testarem, podem observar que algumas vezes são sorteados apenas 6 números e não 7, se alguém puder me ajudar eu agradeceria :S

Abraço!

7 Respostas

ViniGodoy
List&lt;Integer&gt; numeros = new ArrayList&lt;Integer&gt;();

for (int i = 8; i &lt;= 14; i++)
   numeros.add(i);

Collections.shuffle(numeros);

System.out.println(&quot;Os números sorteados foram:&quot;);
for (Integer num : numeros) {
    System.out.println(num);
}

Além disso, prefira usar a classe Random, no lugar de Math.random():

Random r = new Random();
int x = r.nextInt(10); //Gera um número de 0 até 9.
ribclauport

Aproveitando o tópico gostaria de perguntar ao vini como usaria essa classe Randon por exemplo para retorna numeros de 3 ao 10 por exemplo, li em um
artigo que teria que usar o operador % se eu fosse delimitar uma “faixa”, poderia dar um exemplo do uso com Random delimitando uma faixa de números na
hora de randomizar?

Obrigado.

ribclauport

Bom reformulando, como seria usar o Random para delimitar um range com o uso do operador % e randon.nextInt(), poiis usando os outros métodos
fica realmente simples como no código abaixo:

private static void showRandomInteger(int aStart, int aEnd, Random aRandom) {
		if (aStart &gt; aEnd) {
			throw new IllegalArgumentException(&quot;Start cannot exceed End.&quot;);
		}
		// get the range, casting to long to avoid overflow problems
		long range = (long) aEnd - (long) aStart + 1;
		// compute a fraction of the range, 0 &lt;= frac &lt; range
		long fraction = (long) (range * aRandom.nextDouble());
		int randomNumber = (int) (fraction + aStart);
		log(&quot;Generated : &quot; + randomNumber);
	}
retirado de http://www.javapractices.com/topic/TopicAction.do?Id=62

porém gostaria mesmo de saber como fazer da forma que Paulo Silveira diz no seu artigo

Isto vai te gerar um long e um inteiro quaisquer. Se você quiser um número em um intervalo determinado, você precisaria tirar o resto com o operador %

no artigo http://www.guj.com.br/articles/17

Obrigado

ViniGodoy
E mais fácil usar assim:
private static void showRandomInteger(int aStart, int aEnd, Random aRandom) {
    if (aStart &gt; aEnd) {
        throw new IllegalArgumentException(&quot;Start cannot exceed End.&quot;);
    }

    int range = aEnd - aStart + 1;
    return aRandom.nextInt(range) + aStart;
}
ribclauport

Opa, obrigado pela resposta.

B

Valeu Vini, porém tenho de guardar esses números em um vetor e não consigo fazer isso com um ArrayList :S… Tem como ?

ViniGodoy

É só copiar os números para o vetor no final:

List&lt;Integer&gt; numeros = new ArrayList&lt;Integer&gt;();

for (int i = 8; i &lt;= 14; i++)
   numeros.add(i);

Collections.shuffle(numeros);

int resultado[] = new int[numeros.size()];
for (int i = 0; i &lt; numeros.size(); i++) {
   resultado[i] = numeros.get(i);
}

System.out.println(&quot;Os números sorteados foram:&quot;);
for (int num : resultado) {
    System.out.println(num);
}
Criado 21 de fevereiro de 2012
Ultima resposta 22 de fev. de 2012
Respostas 7
Participantes 3