Jump to content

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


jamirooo
 Share

Recommended Posts

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

Link to comment
Share on other 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 😛 . 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"?

Não respondo a dúvidas por mensagem.

Link to comment
Share on other 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 😛

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 😛

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.

Link to comment
Share on other 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.

Link to comment
Share on other 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.

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

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

Quando disse melhores números já imaginava que desse nisto 😛 , 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.

Link to comment
Share on other 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".

Link to comment
Share on other sites

Quando disse melhores números já imaginava que desse nisto 😛 , 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á.

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.