[RESOLVIDO] Gerar aleatorio

15 respostas
gpd38

Blz galera

Estou com uma duvida.

Eu sei que para gerar valores aleatorios eu uso o Math.random(), porem ele gera somente numeros( double), mas sei trata-los para inteiro.

O que eu quero e preciso fazer é gerar uma sequencia de 16 “bitys” que podem contem Letra e numeros.

alguem sabe como fazer? ou ja tem pronta?

Ps:
O modo como pensei foi gerar um conjunto(vetor) de 8 numeros e um outro conjunto(vetor) de 8 numeros.
depois dentro de um for, mistura-se as posições dos dois vetores, porem acho isso muito trabalhoso e que nao vai dar uma sequencia a mais misturada possivel.

Ex de como eu gostaria que ficasse

String valores = 22DCB976D4E26C1C

15 Respostas

B

Já tentou usar a classe java.util.Random?

Random rand = new Random();

String s = Long.toHexString(rand.nextLong()) + Long.toHexString(rand.nextLong());
gpd38

Nunca usei nao

Tem como armazenar em um long?

pimenta

Cara, até tenho uma idéia do que possa dar certo, mas tem dois problemas que se resumem em um só.

1- Você teria que usar os valores da tabela ASCII pra fazer isso
2- Pra usar esses valores teria que rolar um "hard codezinho" de leve.

O problema desse hard code é que se a tabela mudar você teria que mudar seu método também... Compreende o drama? Além disso a forma que pensei pode gerar um overhead pequeno, mas pode. Mesmo assim vou colocar aqui o que to pensando e você vê se te resolve...
public class Exemplo1{	
	public static void main(String[] args){
		String s; //String a ser impressa
		StringBuffer sb = new StringBuffer(); //StringBuffer para o append
		int qtdChars = 1; //Qtd de chars na String
		
		while(qtdChars <= 16){ //String tem que ter 16 chars
		
			int charInt = (int) (Math.random() * 71); //Random para  gerar um número aleatório até 70
																	//70, porque na tabela ASCII o maior caracter que será necessário é o de nro 70 (F)
		
			if(((charInt >= 48) && (charInt <= 57)) || ((charInt >= 65) && (charInt <= 70))){ 
			//Chars de 48 a 57 são os números
			//Chars de 65 a 70 são: A, B, C, D, F
				char c = (char) charInt; //Gerando um caracter de acordo com o ASCII gerado pelo random		
				sb.append(c); //Adiciona o char gerado no StringBuffer
				
				qtdChars++; //Incremente nro de chars no String
			}		
		}
		
		s = sb.toString(); //String recebe o StringBuffer que tem a sentença de 16 bytes nesse momento		
		System.out.println(s); //Imprime o String com o resultado
	}
}

Tá aí, cara, foi o que consegui pensar...
Espero que te ajude de alguma forma...

Abraços,

rafaeldiego

eh pimenta, essa foi boa mesmo hein!

B

Que exagero. Desse modo você está gerando 4 bits por vez, para chegar a 16 bytes, ou 128 bits você precisa executar essa operação 32 vezes, e nem sempre esse random vai cair entre os chars [0-9A-F].

Duas de 64 bits já resolvem o problema.

gpd38

Interessante esse codigo, mas e se eu for guardar em um Long(64 bits), como faço?

pimenta

Bruno, concordo com tudo que disse.
Principalmente o exageiro.
Tanto que coloquei os pontos negativos além do overhead que ele gera, mas o cara queria uma solução e a dei pra ele.

Pra achar os 16 bytes pode ser que o while rode 16 vezes ou pode ser que ele rode milhões de vezes…

Grande rafaeldiego,

Não sei se foi um deboche o seu comentário, mas caso tenha sido porque você não coloca aí um post com a resolução do problema do gpd38?

Abraços,

B
String com 128 bits em hexadecimal para long?
String s = "0123456789ABCDEF0123456789abcdef";

long long1 = Long.parseLong(s.substring(0, 15), 16);
long long2 = Long.parseLong(s.substring(16, 32), 16);
Obs: Estou fazendo isso de cabeça, pode estar errado.

Edit 1: Faltou um ponto-e-virgula.
Edit 2: Estava genérico demais, não necessitava realizar calculos em cima do tamanho da string.

rafaeldiego

eh pimenta, não havia sido um deboche, muito pelo contrário… era tipo um: “boa ideia hein… se saiu bem”

mas, como percebi que nao está de mto bom humor hoje, desconsidere os comentarios acima, pq eu farei o mesmo

pimenta

Realmente não to muito.
Doido pra dormir… cheio de sono.

Te peço desculpas…

Abraços,

P

Cara, não seria mais simples gerar um random dentro de um conjunto de Enum? Tem como?

B

Não entendi a lógica.

P

O enum teria o seguintes elementos:
(A, B, C, D, E, F, 1,2,3,4,5,6,7,8,9,0)

uma função randomica (que não é Java.util.Random) e preencheria um campo com tamanho X executando o random no enum em cima.

Não sei se isso é possivel, foi só uma idéia e pra peguntar se tem como…

P

Aliás, enum não. dãaa. Viagem feia. (Acordei agora). Colocaria isso dentro de um array.

B

Sim, dá pra fazer. Gere um número inteiro entre [0,15], pegue um dos caracteres desse array baseado na posição gerada, concatene na string. Repita quantas vezes quiser.

Criado 21 de maio de 2008
Ultima resposta 21 de mai. de 2008
Respostas 15
Participantes 5