| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/11/2009 17:40:48
|
aloha
JavaChild
Membro desde: 07/08/2008 15:32:24
Mensagens: 139
Offline
|
Pessoal,
Atenção, já vou deixar claro que não quero gerar um Random ok?
O problema é o seguinte:
Digamos que eu tenha 4 números (2,5,7,9)
Eu apenas quero escolher um desses números randomicamente.
Eu pensei em fazer um random entre 1 e 10, se o numero gerado nao for algum desses 4, eu gero o rand novamente, porém existe a possibilidade de eu ficar no loop por muito tempo...
Alguém tem alguma sugestão?
Obrigado!
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/11/2009 17:49:41
|
felipe_gdr
JavaTeenager
Membro desde: 24/04/2006 19:31:36
Mensagens: 176
Localização: Lausanne
Offline
|
crie um array com os numeros, depois use o random() para escolher o indice.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/11/2009 18:10:01
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
A vantagem do método acima é que você pode eliminar o número de índice 0 da lista. E assim, o próximo zero não se repetirá. Bem prático caso você queira fazer um programa de sorteio da mega-sena.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/11/2009 18:24:55
|
felipealbuquerque
JavaGuru
![[Avatar]](/images/avatar/a330f9fecc388ce67f87b09855480ca3.jpg)
Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline
|
Uma variação é a utilização da classe java.util.Random para sortear os elementos da lista, como no exemplo abaixo.
O método nextInt(int n) da classe Random sorteia um número inteiro entre 0 e (n - 1). No exemplo acima, o método sorteará um número entre 0 e o tamanho da lista - 1 (4 - 1).
|
Felipe de Alencar Albuquerque |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/11/2009 20:21:38
|
aloha
JavaChild
Membro desde: 07/08/2008 15:32:24
Mensagens: 139
Offline
|
Simplesmente perfeito! Obrigado a todos.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/11/2009 08:30:24
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
felipealbuquerque wrote:Uma variação é a utilização da classe java.util.Random para sortear os elementos da lista, como no exemplo abaixo.
O ideal é não fazer new Random() inline, como você fez. Isso não garante a geração de números aleatórios caso o método seja chamado várias vezes seguidas, num for, por exemplo. Faça você mesmo o teste:
Para corrigir, retira-se o Random para fora do método, e só inicializa ele uma única vez:
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/11/2009 09:26:38
|
aloha
JavaChild
Membro desde: 07/08/2008 15:32:24
Mensagens: 139
Offline
|
ViniGodoy, o que você disse é valido... Neste mesmo projeto porém em outro problema, eu tive que gerar random dentro de um loop!
Só que tive que por um sleep de 25 milisegundos, senão acabava gerando numeros iguais de vez enquando.
Complicado né, fazer oq, ficou bem mais lento, mas a chance do numero nao repetir é maior!
Abraço
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/11/2009 10:00:18
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Se você criar o objeto random fora do loop, o número não se repetirá. E gerar números iguais de vez enquando é normal. Afinal, o número é aleatório! O que não pode é gerar vários deles seguidos.
This message was edited 1 time. Last update was at 13/11/2009 10:01:17
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/11/2009 11:16:38
|
felipealbuquerque
JavaGuru
![[Avatar]](/images/avatar/a330f9fecc388ce67f87b09855480ca3.jpg)
Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline
|
ViniGodoy wrote:
felipealbuquerque wrote:Uma variação é a utilização da classe java.util.Random para sortear os elementos da lista, como no exemplo abaixo.
O ideal é não fazer new Random() inline, como você fez. Isso não garante a geração de números aleatórios caso o método seja chamado várias vezes seguidas, num for, por exemplo. Faça você mesmo o teste:
(...)
[/code]
Para corrigir, retira-se o Random para fora do método, e só inicializa ele uma única vez:
[code]
(...)
[/code]
Até por questão de evitar a criação de vários objetos desnecessariamnete, sua sugestão é válida. Sempre utilizo essa abordagem.
Quanto a várias instâncias gerarem os números aleatórios, você sabe se por exemplo, em duas chamadas consecutivas, é possível que o seed do Random seja o mesmo currentTimeMillis?
|
Felipe de Alencar Albuquerque |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/11/2009 11:21:36
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
felipealbuquerque wrote:Até por questão de evitar a criação de vários objetos desnecessariamnete, sua sugestão é válida. Sempre utilizo essa abordagem. Quanto a várias instâncias gerarem os números aleatórios, você sabe se por exemplo, em duas chamadas consecutivas, é possível que o seed do Random seja o mesmo currentTimeMillis?
Se as camadas forem criadas simultaneamente, sim. Mas isso geralmente é difícil de acontecer. Se não quiser contar com isso, você pode definir na mão um offset para cada random: Onde offset é um número qualquer como -1, 1, 2, 3, diferente para cada camada.
This message was edited 1 time. Last update was at 13/11/2009 11:21:48
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/11/2009 13:40:09
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Normalmente eu prefiro ter um único gerador Random, e definido estaticamente ainda por cima. Ou seja:
Isso não dá problemas relacionados a ficar criando instâncias de Random que são inicializadas com o mesmo valor de semente (que no caso é System.currentTimeMillis(), um valor que no Windows tem precisão de apenas 10 milissegundos ou ainda mais inexato.)
Entretanto, em alguns sistemas operacionais, SecureRandom "prende" um pouco a execução de seu programa. Por exemplo, em um Linux ele é implementado em termos de /dev/rand ou /dev/random (não tenho certeza), e esse "device" é um bocadinho lento ao ser inicializado. No Windows, é implementado em termos de CryptGenerateRandom (não lembro mais o nome da API), e essa implementação depende do provider da CryptoAPI - às vezes é gerado por hardware, se algum driver de algum dispositivo criptográfico estiver instalado. Aí ele também pode "prender" um pouco a execução.
This message was edited 1 time. Last update was at 13/11/2009 13:42:36
|
|
|
 |
|
|