GERADOR DE SENHA Alfanumerico  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

marcobiscaro2112 wrote: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:

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


e o que isso tem a ver marco ?? a chance é de 1/10 de um número ser escolhido... isso não quer dizer que é um evento sem reposição, onde quando 1 é escolhido, a chance passa a ser de 1/9 para os outros...

acho que essa sua especulação, que em um for de 10 de rnd.nextInt(10) deve aparecer todos os números é algo totalmente equivocado....

lembre-se.... a chance é de 1/10 para cada vez que vc roda o evento... quando vc passa pela segunda vez no for, é como se o 1° evento não tivesse ocorrido, a chace continua sendo de 1/10 para qualquer número, sendo assim em 10 vezes a chance de um número se repetir é extremamente alta.... e a chance de os números nunca se repetirem, e de aparecer os 10 números na sequencia é extremamente baixa

Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17572
Offline

A probabilidade de os números não se repetirem no programa proposto (10 iterações de nextInt (10)), supondo que o gerador de números aleatórios seja perfeito, é de:

10! / 10^10 = 0,00036288 , ou seja, 0,036%.



This message was edited 1 time. Last update was at 02/03/2009 11:59:45

[WWW]
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

a conta do thingol esta correta, apenas para não deixar dúvidas

10! / (10 ^ 10)

pois
- para o 1° evento a chance de não c repetir é de 10 em 10 ou seja 10/10 visto que pode ocorrer qualquer número, pois nenhum número foi tirado anteriormente
- para o 2° evento a chance de não c repetir é de 9 em 10 ou seja 9/10, visto que podem ocorrer todos os números menos o anterior
- para o 3° evento a chance de não c repetir é de 8 em 10 ou seja 8/10, visto que podem ocorrer todos os números menos os 2 números anteriores
- ...
- para o 10° evento a chance de não c repetir é de 1 em 10 ou seja 1/10, visto que não pode ocorrer os 9 números anteriores

como queremos que o 1° evento não se repita, e o 2° e o 3° .... e o 10° devemos multiplicar as probabilidades de cada evendo, tendo então
10/10 * 9/10 * 8/10 * 7/10 ... 1/10 = 10! / (10 ^ 10)

o que da 00,0363% de chance dos números não se repetirem
e 99,9647% de chance de haver repetição de números

This message was edited 1 time. Last update was at 02/03/2009 12:30:00


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2423
Localização: São Paulo - SP
Offline

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.

Marco Biscaro.

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja:http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [MSN]
marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2423
Localização: São Paulo - SP
Offline

Lavieri wrote:
marcobiscaro2112 wrote: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:

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


e o que isso tem a ver marco ?? a chance é de 1/10 de um número ser escolhido... isso não quer dizer que é um evento sem reposição, onde quando 1 é escolhido, a chance passa a ser de 1/9 para os outros...

acho que essa sua especulação, que em um for de 10 de rnd.nextInt(10) deve aparecer todos os números é algo totalmente equivocado....

lembre-se.... a chance é de 1/10 para cada vez que vc roda o evento... quando vc passa pela segunda vez no for, é como se o 1° evento não tivesse ocorrido, a chace continua sendo de 1/10 para qualquer número, sendo assim em 10 vezes a chance de um número se repetir é extremamente alta.... e a chance de os números nunca se repetirem, e de aparecer os 10 números na sequencia é extremamente baixa


Mas foi exatamente isso que eu disse!!! Ele estava com problemas na senha gerada e eu disse que não necessariamente obteremos todos os números, e que há a possibilidade de obter-se números repetidos. Não disse que "em um for de 10 de rnd.nextInt(10) deve aparecer todos os números". Disse exatamente o contrário: que isso é incerto.

Marco Biscaro.

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja:http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [MSN]
blackfalcon
JavaEvangelist
[Avatar]

Membro desde: 01/04/2008 21:08:28
Mensagens: 347
Offline

marcobiscaro2112 wrote: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.


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
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

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...

This message was edited 1 time. Last update was at 03/03/2009 09:33:37


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

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


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



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...

...........

No caso 2 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


tente trocar por isso


.......................

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....

This message was edited 3 times. Last update was at 03/03/2009 10:30:18


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 6596
Localização: São Paulo/SP
Offline

marcobiscaro2112 wrote: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:

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


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.

Github Facebook +Mark @MarkyHitchhiker WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

Mark_Ameba wrote: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.


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

ele vai fazer um loop com a quantidade exata, e vai fazer o embaralhamento

Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 6596
Localização: São Paulo/SP
Offline

Lavieri wrote:

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

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).

Github Facebook +Mark @MarkyHitchhiker WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

Mark_Ameba wrote:
Lavieri wrote:

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

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).


obvio que garante.... vou te dar um exemplo...

digamos que eu tenha uma lista...

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

quando vc faz um outra lista Lost<Cor> 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}


This message was edited 1 time. Last update was at 03/03/2009 11:57:33


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
blackfalcon
JavaEvangelist
[Avatar]

Membro desde: 01/04/2008 21:08:28
Mensagens: 347
Offline

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
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

blackfalcon wrote: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


+ 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

Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

Mark_Ameba wrote: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.


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


reulstado...


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



Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team