Numeros Aleatorios

16 respostas
evertonsilvagomesjav

Galera minha pergunta é, teria como gerar numeros aleatorios como esses ai da megasena sem usar Set ,List, Collections.shuffle, random ou algum tipo de array, to pensando aqui, mas fica meio dificil né?

16 Respostas

marcelo.bellissimo

Use Math.random()

Math.random() gera um numero double de valor >= 0.0 (maior-ou-igual a 0.0) e < 1.0 (menor que 1.0, veja bem, NÃO inclui o 1.0) …

Voce terá que arredondar os numeros, óbviamente… pra cima ou pra baixo, depende da sua lógica…
Por exemplo:

Math.random() * 60Vai gerar números entre 0.0 e 59.999999, sei lá até onde vai, mas o 60 não será gerado nunca…

Voce pode fazer algo do tipo:

Math.random() * 61e arredondar o numero…

evertonsilvagomesjav

com a API eu fiz aqui.

E

http://www.guj.com.br/posts/list/30498.java#164581

evertonsilvagomesjav

é sem usar á API :cry:

magocebolinha

O exercicio pede que você não use API é isso?? :twisted: :twisted: :twisted: :twisted:

M

Deu uma pesquisada no Google?

Boa sorte!

ViniGodoy

Tente isso:

public class Random
{
   int semente;
   int z = 1;   

   public Random()
   {
       this((int)System.currentTimeMillis());
   }

   public Random(int semente) {
      this.semente = semente == 0 ? 1 : semente;
   }

   public int nextInt()
   {
       z = 36969 * (z & 65535) + (z >> 16);
       semente = 18000 * (semente & 65535) + (semente >> 16);
      return Math.abs((z << 16) + semente);  
   }

   public int nextInt(int min, int max)
   {
       return (nextInt() % (max-min)) + min;
   }

   public static void main(String[] args)
   {
       Random r = new Random();
       for (int i = 0; i < 100; i++)
           System.out.println(r.nextInt(1,60));
   }
}

Esse é um algoritmo chamado Multiply with Carry. O ideal seria implementar o Mersene Twistter. É mais rápido e tem melhor resultado, mas ia exigir que você usasse um array. Você pode ver uma implementação de Mersene Twistter aqui.

evertonsilvagomesjav

Nem e exercicio nao cara é curiosidade mesmo, tava pensando aqui em alguma forma mas nao me veio a cabeça por isso perguntei.

evertonsilvagomesjav

mspereira:
Deu uma pesquisada no Google?

Boa sorte!

Random é foda…

evertonsilvagomesjav
ViniGodoy:
Tente isso:
public class Random
{
   int semente;
   int z = 1;   

   public Random()
   {
       this((int)System.currentTimeMillis());
   }

   public Random(int semente) {
      this.semente = semente == 0 ? 1 : semente;
   }

   public int nextInt()
   {
       z = 36969 * (z & 65535) + (z >> 16);
       semente = 18000 * (semente & 65535) + (semente >> 16);
      return Math.abs((z << 16) + semente);  
   }

   public int nextInt(int min, int max)
   {
       return (nextInt() % (max-min)) + min;
   }

   public static void main(String[] args)
   {
       Random r = new Random();
       for (int i = 0; i < 100; i++)
           System.out.println(r.nextInt(0,60));
   }
}

Esse é um algoritmo chamado Multiply with Carry. O ideal seria implementar o Mersene Twistter. É mais rápido e tem melhor resultado, mas ia exigir que você usasse um array. Você pode ver uma implementação de Mersene Twistter aqui.

Vini mais uma vez muito obrigado pela ajuda!!!

ViniGodoy

Existem outras implementações desse mesmo algoritmo, dê uma olhada:
http://216.154.219.151/tutorials/random_numbers/multiply_with_carry.shtml

Essa inclusive é bem compacta:
final long a = 0xffffda61L;
long x = System.nanoTime() & 0xffffffffL;

public int nextInt() {
  x = (a * (x & 0xffffffffL)) + (x >>> 32);
  return (int) x;
}
marcelo.bellissimo

Essas implementações são bem simples, bom saber… estava dando uma olhada na implementação do Random e é meio complicada de entender… essas são bem mais simples… gostei, só pela curiosidade também…

evertonsilvagomesjav
ViniGodoy:
Existem outras implementações desse mesmo algoritmo, dê uma olhada: http://216.154.219.151/tutorials/random_numbers/multiply_with_carry.shtml Essa inclusive é bem compacta:
final long a = 0xffffda61L;
long x = System.nanoTime() & 0xffffffffL;

public int nextInt() {
  x = (a * (x & 0xffffffffL)) + (x >>> 32);
  return (int) x;
}

Muito bacana, nao vinha na cabeça nenhuma forma de fazer, e meio complexo fazer sem usar a API, não conhecia essas implementações.

ivanmarreta

import java.util.Random;

public class Randomico {

public static void main(String[] args) {
	
	int[] numeros = new int [6];
		
	
	Random randomico = new Random();
	
	
	System.out.println("Resultado da MegaSena:");
	for (int i=0; i<numeros.length;i++){
		Random random = new Random();
		numeros[i] = random.nextInt(100);
		System.out.print(" - " + numeros[i]);
		
	}
	
	
	
	
	
	
}

}
:stuck_out_tongue:

M

Dica: Formatar o código com o botão Code.
Dica: Ler o post antes de responder.
Dica: Números da megasena vão de 1 a 60.

Boa sorte!

ViniGodoy
ivanmarreta:
:P

Quando for responder:

1. Leia o que o autor do tópico perguntou (se você tivesse lido, veria que ele falou em gerar números aleatórios "no braço", sem o uso da classe Random);
2. Sempre que postar códigos, use a tag [code] para que seu código fique colorido e formatado:
[code]
seu código
[/code]

Criado 8 de abril de 2010
Ultima resposta 9 de abr. de 2010
Respostas 16
Participantes 7