Numeros Aleatorios

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é?

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…

com a API eu fiz aqui.

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

é sem usar á API :cry:

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

Deu uma pesquisada no Google?

Boa sorte!

Tente isso:

[code]
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));
}
}[/code]

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.

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

[quote=mspereira]Deu uma pesquisada no Google?

Boa sorte!

[/quote]

Random é foda…

[quote=ViniGodoy]Tente isso:

[code]
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));
}
}[/code]

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.[/quote]

Vini mais uma vez muito obrigado pela ajuda!!!

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:

[code]final long a = 0xffffda61L;
long x = System.nanoTime() & 0xffffffffL;

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

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…

[quote=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:

[code]final long a = 0xffffda61L;
long x = System.nanoTime() & 0xffffffffL;

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

[/quote]

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.

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:

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!

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]