Entendi… mas o que isso tem haver com os erros que estao ocorrendo com o codigo?
Obrigado pela ajuda galera!
Abraços
Entendi… mas o que isso tem haver com os erros que estao ocorrendo com o codigo?
Obrigado pela ajuda galera!
Abraços
[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]
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
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%.
a conta do thingol esta correta, apenas para não deixar dúvidas
10! / (10 ^ 10)
pois
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
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=Lavieri][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]
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[/quote]
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.
[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]
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.