GERADOR DE SENHA Alfanumerico

[quote=marcobiscaro2112]Você está obtendo algum erro de compilação ou somente inconsistência de dados?

Se for só problema com os dados, é por causa dos números repetidos. Por exemplo, você manda gerar uma senha com 3 letras maiúsculas e 5 números. Se a lógica anterior for usada, valores irão repetir e seu resultado dificilmente terá 3 letras maiúsculas e 5 números de fato.[/quote]

Cara, se possivel rode a aplicaçao e veja o resultado.

Roda o case 1 e o case 2 e veja que nao é obtido o esperado. Nao sei qual é o erro, se alguem souber por favor apenas fale o erro e de os passos para um futuro concerto do programa, mas sem falar como arrumar a falha…

Obrigado galera pela ajuda

Abraços

ja que vc esta com a duvida poderia ajudar e colocar essas respostas

1° diga para nos qual o resultado que vc espera…
2° rode o programa… escolha 1, e posta aqui o resultado
3° rode novamente… escolha 2, e posta aqui o resultado

fazendo isso, vc vai ajudar a todos entender o seu problema, o que vc esperava, o que esta ocorrendo… assim fica mais facil para todos, fica ai a sugestão…

Li o seu código… e se sua vontade, [size=18]no caso 1[/size], é que apos digitar as letras, haja apenas um embaralhamento das letras, mas mantendo elas sempre, o seu erro esta aqui

[code] String[] carac = car.split("");

     for ( i = 0; i < carac.length; i++) {
        int a = ran.nextInt(carac.length);
        senha += carac[a];
     }[/code]

esse trecho do código simplismente sorteia (ou seja escolhe valores aleatorios que podem se repetir) entre os caracters digitados, e não embaralha (ou seja mantem o mesmo número de caracter apenas troca as suas posições) eles…

para embaralhar use o trecho abaixo

List<String> carac = Arrays.asList(car.split("")); Collections.shuffle(carac); for (String s : carac) senha += s;

Collections.shuffle(List) faz exatamente isso, embarralhas os elementos de 1 lista, depois de embaralhar através do for seguinte caracter a caracter é colocado na String senha.

Ps.: stringbuffs são melhor para esse tipo de coisa…

[size=18]No caso 2[/size] a mim parece claro que depois de escolher randomicamente entre os elementos das 3 matrizes, o que vc ker depois é embaralhar o resultado disso… portanto, se for isto que vc ker, o erro esta na mesma parte do código

[code] String[] total = str.split("");

     for (i = 0; i < total.length; i++){
        int a = ran.nextInt(total.length);
        tot += total[a];
     }[/code]

tente trocar por isso

List<String> carac = Arrays.asList(str.split("")); Collections.shuffle(carac); for (String s : carac) tot += s;

Enfim, não tenho como precisar o que vc ker, pois não sei o que vc espera dos eventos 1 e 2… porem saiba… random.nextInt() como vc tava usando é um sorteio com reposição, ou seja… vc sorteia N vezes um elemento, porem, ele pode se repetir pois a mesma lista estava sempre la…

existem varias formas de fazer um sortei sem reposição… quando vc ker um sorteio de todos os elementos sem reposição a forma mais rapida (pois já esta pronta) é usar a função shuffle de collections… porem existem outras formas… como por exemplo, colocar todos os elementos em 1 lista, e ir dando REMOVE randomicamente na lista, e ir guardado em outra lista cada elemento do remove, quando a lista acaba, a lista nova vai ser igual a entiga embaralhada…

[quote=marcobiscaro2112]Porque o Random não gera um número randômico, e sim um número pseudo-randômico, que teoricamente (e apenas teoricamente) tem chance igual de ser escolhido dentre todas as possibilidades. Mas na prática isso é diferente. Experimente fazer o seguinte: crie uma classe com o método main e coloque o seguinte código:

Random rnd = new Random();
for (int i = 0; i < 10; i++) {
    System.out.println(rnd.nextInt(10));
}

A pergunta é: todos os números são sorteados sem se repetir?[/quote]

Mas o que isso tem a ver com não se repetir?

Se quiser que não se repita crie um HashSet vá adicionando os valores lá até o HashSet ter o tamanho esperado do resultado… então um for each juntara o resultado e retornara ao usuario.

[quote=Mark_Ameba]Mas o que isso tem a ver com não se repetir?

Se quiser que não se repita crie um HashSet vá adicionando os valores lá até o HashSet ter o tamanho esperado do resultado… então um for each juntara o resultado e retornara ao usuario.[/quote]

depois de ler o código dele, ate entendi o que tinha ver… pelo o que pude notar, o cara esava fazendo um sorteio com reposição, que é o caso deste FOR, mais queria na verdade um embaralhamento dos elementos…

essa sua solução do HashSet funciona, porem ao meu ver é lenta, pois vai ficar no loop mais vezes que o necessario, pois ate o random não pegar um número que ainda não esteja na lista ele continuará lá… quando a String tiver 200 caracters por exemplo, pode se tornar uma grande complicação esperar que ele encontre os 200 caracters em um loop através de random, pode demorar bastante pra ocorrer…

Se tiver que fazer de modo manual, meu conselho é… adcionar os caracters a um List, e usar o comando remove com um número random… algo assim

int tamanho = listaNormal.size(); List listaEmberalhada = new ArrayList(tamanho); for (int i = 0; i < tamanho; i++) listaEmbaralhada.add(listaNormal.remove(rnd.nextInt(listaNormal.size()));
ele vai fazer um loop com a quantidade exata, e vai fazer o embaralhamento

Isso ainda não garante não repetir o numero… por que da primeira vez voce pode ter 10 elementos na segunda 9, terceira 8,… mas todos os numeros inferiores ainda podem ser sorteados.

E a solução do HashMap eu passei por que não existe um gerador de numeros randomicos que não se repitam(Até onde sei).

[quote=Mark_Ameba][quote=Lavieri]

Se tiver que fazer de modo manual, meu conselho é… adcionar os caracters a um List, e usar o comando remove com um número random… algo assim

int tamanho = listaNormal.size(); List listaEmberalhada = new ArrayList(tamanho); for (int i = 0; i < tamanho; i++) listaEmbaralhada.add(listaNormal.remove(rnd.nextInt(listaNormal.size()));
ele vai fazer um loop com a quantidade exata, e vai fazer o embaralhamento
[/quote]

Isso ainda não garante não repetir o numero… por que da primeira vez voce pode ter 10 elementos na segunda 9, terceira 8,… mas todos os numeros inferiores ainda podem ser sorteados.

E a solução do HashMap eu passei por que não existe um gerador de numeros randomicos que não se repitam(Até onde sei).[/quote]

obvio que garante… vou te dar um exemplo…

digamos que eu tenha uma lista…

List cores
onde contenha os elementos nessa sequencia {vermelho, laranja, azul, marrom, verde}

quando vc faz um outra lista Lost coresEmbaralhadas
int randomico = rdn.nextInt(cores.size());

ele fara um sorteio de 0 ate 4 suponha que foir sorteado o numero 2… no momento que vc faz

coresEmbaralhadas.add(cores.remove(randomico));

vc vai retirar a cor azul da lista cores, e vai adciona-la a lista coresEmbaralhadas…

agora a lista cores = {vermelho, laranja, marrom, verde}
e a lista coresEmbaralhadas = {azul}

quando vc rodar a sequencia denovo… não tem como ele escolher a cor azul, pois ela não existe + na 1° lista, e ja esta na segunda

… seguindo o mesmo reciocinio, supondo que depois o número sorteado foram 3,1,0,0 teriamos o seguinte

cores = {}
coresEmbaralhadas = {azul,verde,laranja,vermelho,marrom}

como vc vê, mesmo saindo número repetido, saiu o zero 2 vezes, as cores não se repetem

apenas detalhando…

quando o sorteio for o 3 ficariamos com
agora a lista cores = {vermelho, laranja, marrom}
e a lista coresEmbaralhadas = {azul, verde}

quando o sorteio for o 1 ficariamos com
agora a lista cores = {vermelho, marrom}
e a lista coresEmbaralhadas = {azul, verde,laranja}

quando o sorteio for o 0 ficariamos com
agora a lista cores = {marrom}
e a lista coresEmbaralhadas = {azul, verde,laranja,vermelho}

quando o sorteio for o 0 ficariamos com
agora a lista cores = {}
e a lista coresEmbaralhadas = {azul, verde,laranja,vermelho,marrom}

Lavieri, muito obrigado cara!

Muito obrigado mesmo, pois alem de me explicar aonde tinha errado deu uma grande dica sobre o List… nunca usei List, ate onde eu sei é tipo um array ne… estou voltando a info agora e estudando array… irei ver sobre esse List jaja, mas o seu exemplo ficou bem explicado cara!

Galera, obrigado a todos…

Abraços

[quote=blackfalcon]Lavieri, muito obrigado cara!

Muito obrigado mesmo, pois alem de me explicar aonde tinha errado deu uma grande dica sobre o List… nunca usei List, ate onde eu sei é tipo um array ne… estou voltando a info agora e estudando array… irei ver sobre esse List jaja, mas o seu exemplo ficou bem explicado cara!

Galera, obrigado a todos…

Abraços[/quote]

  • ou - … digamos que List é uma array um pouco + avançado, é como se fosse uma extensão de array, ela faz parte da Java Collection Framework …

uma List na essencia usa array, so que ela não tem necessariamente um tamanho fixo, vc pode colocar itens infinitamente dentro de uma List… a list é capaz de remover itens tb… internamente ela usa array, faz copia de uma array pra outra e vai trocando os dados dentro dela, para manter sua interface em ordem para o usuario… vc não precisa entender como ela funciona internamente, mais apenas a intarface que ela se propoem…

saiba de antimão, que nem todas as List tem todos os seus métodos funcionando… por exemplo… Arrays.asList(array) retorna uma list que não tem os métodos remove implementado, acredito que nem ADD ela faz… se vc usar uma ArrayList() vai ter todas as funcionalidade de List…

existem outras opções tb… boa sorte ai nos estudos

ahh outra coisa que lembrei, se na lista que a pessoa digitar houver itens duplicados… por exemplo… caso a pessoa escolha 1 e digite “abadsec” … caso vc use HashSet para embaralhar, nunca dará certo, visto que existem 2 “a” nessa lista, não vai dar pra embaralhar…

sem falar que fiz um teste simples… apenas para vc ver o número de iteração que ocorre com HashSet, e com um exemplo simples, com remove, que embaralha facilmente números

[code]public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    for (int i = 0 ; i<10; i++)
        rodar();
    
    rodar2();
}

public static void rodar() {
    Random rdn = new Random();
    int count = 0;
    List<Integer> numeros = new ArrayList<Integer>();
    for(int i = 0; i < 200; i++)
        numeros.add(i);
    Set<Integer> numerosRandomicos = new HashSet<Integer>();
    while(numerosRandomicos.size() < numeros.size()) {
        numerosRandomicos.add(numeros.get(rdn.nextInt(numeros.size())));
        count ++;
    }
    System.out.println(count);
}

public static void rodar2() {
    Random rdn = new Random();
    List<Integer> numeros = new ArrayList<Integer>();
    for(int i = 0; i < 10; i++)
        numeros.add(i);
    String numerosEmbralhados = "";
    for(int i = 0; i<10; i++) {
        numerosEmbralhados += numeros.remove(rdn.nextInt(numeros.size())) + ",";
    }
    System.out.println(numerosEmbralhados);
}

}[/code]

reulstado…

1362 1294 1142 1282 812 1103 1285 1490 1049 1125 6,7,3,5,4,9,2,1,0,8,

como vc ve, com HashSet ha iterações bem além das 200 necessarias…
e com remove, fiz um pequeno exemplo só com 0 a 9, so pra ver que não há repetições

Ahh… erro meu mesmo… eu não li a parte do remove…

sorry

.

O gerador de senha do “marcobiscaro2112” ficou muito bom rsrs. Gostei

(+1)

abraços.