Números randomicos!?

7 respostas
arm.jr

Eu estou fazendo o jogo da memoria, são 16 posições, portanto vou usar 8 figuras.
Estou usando botões (JButton) para colocar as figuras, fazer o controle, etc.etc…

Então o que eu queria era gerar números aleatórios de 1 a 8 para colocar nas posições dos botões.
Esse número de 1 a 8 vai ser o nome do arquivo de imagem tipo, 1.jpg, 2.jpg etc…etc…

Tipo assim:

BOTÃO 1 =&gt FIGURA =&gt 5
BOTÃO 2 =&gt FIGURA =&gt 4
BOTÃO 3 =&gt FIGURA =&gt 2
.
.
.
Ate BOTÃO 16.

Então o número da figura tem que estar entre 1 e 8.

  • Só pode repetir 1 vez o mesmo número, claro né!! hehe
  • Não pode aparecer o 0 (zero)

Mas o problema e que do jeito que eu fiz esta repetindo várias vezes o mesmo número.

Alguem pode me ajudar, ou tem outra ideia sei lá! hehehe

package MEMORIASAM;
import java.util.Random;

[color=red]public class Aleatorio

{

public static void main(String[] args)

{

Random r = new Random();

for (int i = 0; i &lt 16; i++)

System.out.println("BOTÃO : "+(i+1)+"    FIGURA : "+r.nextInt(6));

}

}[/color]

7 Respostas

marcos.junqueira

cara, acho q vc deveria tentar embaralhar um vetor
faça um vetor com 8 posições
faça um loop randomico entre 1 e 100
dentro do loop faça a troca de posição dos elementos do vetor de forma randomica tambem, ou seja, escolha 2 numeros randomicos entre o 0 e o tamanho do vetor-1 e troque essas posições do vetor

Anderson_Leite

Crie um array pra guardar as posições já geradas pelo random, que não deve se repetir. Mais ou menos assim.
Não sei pq não tem algo assim já na Random, pra não repetir números. Talvez alguém saiba e possa dar a dica.
Acho q vc vai ter q adaptar algumas coisas mas espero q te ajude.

ArrayList list8 = new ArrayList();
		int[] selecionados = new int[8];		
		int l =0;
		int count = 0;				
		Random rd = new Random();
		int i = 0;			

		while(list8.size()!=8){		
				
			//int para verificar se número randomico foi gerado antes
			l=0;
			//gera número randomico entre 8 
			i= rd.nextInt(8);

			//verifica se  pegou o valor gerado pelo numero randomico
			for(int k=0;k<9;k++){
				if(selecionados[k]==i)
					l++;
			}
				//se o número randomico nao é repetido, coloca na list 
			if(l==0){
				list8.add(//adicione o q vc quer aqui);
				selecionados[count]=i;
				count++;
			}
		}
diego2005

Uma opção também seria criar um conjunto que não permite duplicatas (Set) e criar um vetor de 8 posições de objetos Integer, como o conjunto não permite duplicatas, enquanto o tamanho dele for menor que 8 você continua gerando os números. Não sei se essa estratégia vai ficar lenta por ter que criar os objetos Integer até consegui os 8 números diferentes…

T

Para não repetir números, use o método shuffle da classe Collections.

import java.util.*;
import java.security.*;

class Sorteio {

    public static void main(String[] args) {
        int nAlternativas = Integer.parseInt (args[0]);
        int nApostas = Integer.parseInt (args[1]);
        int nCartoes = Integer.parseInt (args[2]);
        List&lt;Integer&gt; numeros = new ArrayList&lt;Integer&gt;();
        Random rand = new SecureRandom();
        //-- Gerando a lista dos n·meros de 1 a nAlternativas, na ordem
        for (int i = 1; i &lt= nAlternativas; ++i) {
            numeros.add (new Integer (i));
        }
        //-- Embaralhando os n·meros
        for (int j = 0; j &lt nCartoes; ++j) {
            Collections.shuffle (numeros, rand);
            Set&lt;Integer&gt; ordenados = new TreeSet&lt;Integer&gt;();
            for (int i = 0; i &lt nApostas; ++i) {
                ordenados.add (numeros.get(i));
            }
            for (Integer i: ordenados) {
                System.out.printf ("%02d ", i);
            }
            System.out.println ();
        }
    }
}
rhenrique

Utilize a classe java.security.SecureRandom. Para gerar números aleatórios entre 1 e 8, faça:

SecureRandom random = new SecureRandom(); int numeroAleatorio = (random.nextInt() % 8) + 1;

Para garantir que a geração seja totalmente aleatória, você pode usar o construtor de SecureRandom que recebe uma semente como um array de bytes.

arm.jr

Andei testando os algorimos que postaram aqui!

Eles estão gerando mais de 2 repetições de um número, no caso só pode ser 2.

WellingtonRamos

Faça as adaptações necessárias :slight_smile:

/*
 * RandomList.java
 */
package testes;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

/**
 * @author wellington.nogueira
 *
 * 11/10/2006
 */
public class RandomList {

	public static void main(String[] args) {
		
		List imageList = new ArrayList();
		imageList.add("imagem1");
		imageList.add("imagem2");
		imageList.add("imagem3");
		imageList.add("imagem4");
		imageList.add("imagem5");
		imageList.add("imagem6");
		imageList.add("imagem7");
		imageList.add("imagem8");
		imageList.add("imagem1");
		imageList.add("imagem2");
		imageList.add("imagem3");
		imageList.add("imagem4");
		imageList.add("imagem5");
		imageList.add("imagem6");
		imageList.add("imagem7");
		imageList.add("imagem8");
		
		Map hash;
		try {
			hash = obterTabela(imageList);
			
			for (int i = 0; i < hash.size(); i++) {
				Integer integer = new Integer(i);
				System.out.println(integer.toString() + ":" + hash.get(integer).toString());
			}
			
		} catch (RuntimeException e) {
			System.err.println(e.getMessage());
		}
		
	
	}

	private static Map obterTabela(List imageList) {
		Map m = new Hashtable();
		
		for (int i = 0, maxButtons = imageList.size(); i < maxButtons; i++) {
			int imageListPosition = (int)(Math.random() * imageList.size());
			m.put(new Integer(i), imageList.get(imageListPosition));
			
			imageList.remove(imageListPosition);
		}
		
		return m;
	}
}
Criado 11 de outubro de 2006
Ultima resposta 11 de out. de 2006
Respostas 7
Participantes 7