• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

jamirooo

Random: diferença entre nextDouble() e nextGaussian() [Resolvido]

12 mensagens neste tópico

Boas! alguem me sabe dizer qual  a diferença entre os dois? é que pelo que vi ambas produzem "doubles" aleatórios entre 0.0 e 1.0 ....      agradeço desde já!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O primeiro devolve-te um número aleatório entre 0L e 1L, sem mais questões, isto é, é um valor double que existe entre 0 e 1 escolhido de forma pseudo-aleatória. O segundo, apesar de te devolver um double também pseudo-aleatório, retira o valor de um conjunto aleatório de valores que seguem uma distribuição normal com média 0 e devio padrão 1.

Onde é que isto te ajuda?, em nada :P. O método nextDouble() é mais simples de usar mas devolve valores que são "menos" aleatórios que os devolvidos pelo segundo método. Na prática a diferença não costuma ser significativa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hmmm...ok...mas quer dizer entao que o nextGaussian() tambem me da doubles entre 0 e 1  é?  :hmm:    é que essas cenas de desvio padrão etc....não percebo nada..chumbei a probabilidades e estatística... :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O primeiro devolve-te um número aleatório entre 0L e 1L, sem mais questões, isto é, é um valor double que existe entre 0 e 1 escolhido de forma pseudo-aleatória. O segundo, apesar de te devolver um double também pseudo-aleatório, retira o valor de um conjunto aleatório de valores que seguem uma distribuição normal com média 0 e devio padrão 1.

Onde é que isto te ajuda?, em nada :P. O método nextDouble() é mais simples de usar mas devolve valores que são "menos" aleatórios que os devolvidos pelo segundo método. Na prática a diferença não costuma ser significativa.

Então o nextDouble devolve valores entre 0 e 1 com distribuição uniforme? Se assim é porque é que dizes que é "menos aleatório"?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim qualquer um devolve um valor entre 0 e 1, do tipo double, o mais provável é que nem precises saber a diferença :P

Então o nextDouble devolve valores entre 0 e 1 com distribuição uniforme? Se assim é porque é que dizes que é "menos aleatório"?

A forma como o algoritmo funciona daria, em princípio, valores "melhores". Os termos não são bons de se aplicar, por isso os coloquei entre aspas, na verdade, e tendo em conta a natureza probabilistica do algoritmo não é garantido que seja melhor ou pior, depende tanto da seed usada como da "sorte", que nem sorte é dado que nada é aleatório em programação :P

O algoritmo do método netxGaussian calcula valores entre -1 e 1, daí ter uma média de zero e desvio padrão de 1, logo existem mais valores, embora sejam simétricos, de onde encontrar um aleatório.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na maior parte dos casos em que uso um gerador de números aleatório, aquilo que quero é uma distribuição uniforme, logo o método a usar será o nextDouble.

Considerando que todos os números são iguais, eu diria antes que o nextDouble é mais aleatório, pois o nextGaussian deverá devolver mais vezes valores próximos de 0 do que próximos de 1. No entanto, tudo depende do fim para o qual estamos a recorrer à função. E a questão nem é qual o mais aleatório, mas qual é a distribuição que quero usar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exactamente Rui Carlos, por isso é que perguntei. Quando estamos a modelar algo como um lançamento de um dado o que faz sentido é usar nextDouble. Se quisermos modelar grandezas de uma população como altura, peso, etc. aí o nextGaussian já será melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esqueci-me um pouco deste tópico...

Quando disse melhores números já imaginava que desse nisto :P, o método nextDouble devolve valores pseudo-aleatórios, não usa uma distribuição de probabilidade para obter os valores. Por oposição, o método nextGaussian, usa uma distribuição de probabilidade o que resulta no método ser bastante bom a gerar números pseudo-aleatórios e números verdadeiramente aleatórios, embora o algoritmo usado em Java não ser um dos mais usados para gerar números verdadeiramente aleatórios.

No primeiro método a fórmula de cálculo acaba por criar repetições muito rapidamente, e é necessário usar o "truque" de colocar a semente como sendo o valor do relógio para que os números pareçam aleatórios.

Claro que depende do objectivo a dar aos valores, por exemplo, para um algoritmo genético que estou a desenvolver, o uso de nextDouble com uma semente constante é necessário, isto porque pretendo comparar diversas funções de fitness e métodos de selecção, pelo que embora precise de números aleatórios, também preciso que esses números possam ser repetidos em execuções distintas ou não vou conseguir comparar os parâmetros que pretendo testar.

Numa situação onde se pretenda modelar dados que tenham uma distribuição normal ou com capacidade de serem aproximados à normal, o método nextGaussian é o mais indicado, na generalidade dos casos o método nextDouble é suficiente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

[...] o método nextDouble devolve valores pseudo-aleatórios, não usa uma distribuição de probabilidade para obter os valores.

Não sei como é que o método está implementado, mas uma boa implementação devia produzir resultados que correspondam a uma distribuição uniforme.

Aliás, se se ler a documentação do Java temos:

Returns the next pseudorandom, uniformly distributed double value between 0.0 and 1.0 from this random number generator's sequence.

e

Returns the next pseudorandom, Gaussian ("normally") distributed double value with mean 0.0 and standard deviation 1.0 from this random number generator's sequence.

Ou seja, a única diferença é mesmo o tipo de distribuição.

Por oposição, o método nextGaussian, usa uma distribuição de probabilidade o que resulta no método ser bastante bom a gerar números pseudo-aleatórios e números verdadeiramente aleatórios, embora o algoritmo usado em Java não ser um dos mais usados para gerar números verdadeiramente aleatórios.

No primeiro método a fórmula de cálculo acaba por criar repetições muito rapidamente, e é necessário usar o "truque" de colocar a semente como sendo o valor do relógio para que os números pareçam aleatórios.

Como já disse, esse "por oposição" está incorrecto, ambos seguem uma distribuição de probabilidade.

Se o nextDouble produz repetições mais rapidamente, então é porque está mal implementado, pois devia ser ao contrário, o nextGaussian é que devia repetir valores mais rapidamente (os que estão mais próximos do 0), pois é isso que acontece numa distribuição normal. Mas acho estranho que um se comporte melhor do que o outro, visto que, pelo que vi na documentação do Java, o nextGaussian é implementado à custa do nextDouble, e dado o nome que têm (next*) parece-me que ambos precisam de uma semente para se garantir a aleatoriedade.

Numa situação onde se pretenda modelar dados que tenham uma distribuição normal ou com capacidade de serem aproximados à normal, o método nextGaussian é o mais indicado, na generalidade dos casos o método nextDouble é suficiente.

Da mesma forma que "onde se pretenda modelar dados que tenham uma distribuição normal ou com capacidade de serem aproximados à normal, o método nextGaussian é o mais indicado", "onde se pretenda modelar dados que tenham uma distribuição uniforme ou com capacidade de serem aproximados à distribuição uniforme, o método nextDouble é o mais indicado".

Tanto um como outro podem ser "o mais indicado", e não apenas "suficiente".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hum... Agora estou confuso, isso vai contra o que sabia de geradores de números aleatórios. Confesso que fiquei sem palavras e admito estar errado, vou ter de ver como está a funcionar esse código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando disse melhores números já imaginava que desse nisto :P, o método nextDouble devolve valores pseudo-aleatórios, não usa uma distribuição de probabilidade para obter os valores. Por oposição, o método nextGaussian, usa uma distribuição de probabilidade o que resulta no método ser bastante bom a gerar números pseudo-aleatórios e números verdadeiramente aleatórios,

Isso tem a ver com um desconhecimento na área da teoria das probabilidades. A aleatoriedade de uma distribuição uniforme e de uma gaussiana é exactamente a mesma. Num gerador de números aleatórios não existe verdadeira aleatoriedade. Como disse o Rui Carlos e pelo que sei, os algoritmos para gerar números pseudoaleatórios com distribuição gaussiana baseiam-se em geradores com distribuição uniforme.

Basta ver que se tiveres números X entre 0 e 1 gerados com distribuição uniforme. Se devolveres o quantil X de uma gaussiana, Y, então Y terá distribuição gaussiana. Estás apenas a aplicar uma transformação ao X, se este for aleatório Y também será.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso tem a ver com um desconhecimento na área da teoria das probabilidades.

É bem possível que me esteja a falar aqui algum conhecimento, asssim que tiver oportunidade vou consultar alguma da bibliografia que tenho. Se tiverem bibliografia que possam partilhar gostaria de ver.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora