Como escolher um numero randomicamente!  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
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!
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.
ViniGodoy
Moderador
[Avatar]

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
[WWW]
felipealbuquerque
JavaGuru
[Avatar]

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
[MSN]
aloha
JavaChild

Membro desde: 07/08/2008 15:32:24
Mensagens: 139
Offline

Simplesmente perfeito! Obrigado a todos.
ViniGodoy
Moderador
[Avatar]

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
[WWW]
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
ViniGodoy
Moderador
[Avatar]

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
[WWW]
felipealbuquerque
JavaGuru
[Avatar]

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
[MSN]
ViniGodoy
Moderador
[Avatar]

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
[WWW]
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

 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team