jamirooo Posted May 9, 2008 at 09:47 PM Report Share #184234 Posted May 9, 2008 at 09:47 PM 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á! Link to comment Share on other sites More sharing options...
Knitter Posted May 9, 2008 at 11:59 PM Report Share #184247 Posted May 9, 2008 at 11:59 PM 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. www.sergiolopes.eu Link to comment Share on other sites More sharing options...
jamirooo Posted May 10, 2008 at 12:45 AM Author Report Share #184250 Posted May 10, 2008 at 12:45 AM hmmm...ok...mas quer dizer entao que o nextGaussian() tambem me da doubles entre 0 e 1 é? ? é que essas cenas de desvio padrão etc....não percebo nada..chumbei a probabilidades e estatística... 😛 Link to comment Share on other sites More sharing options...
pedrosorio Posted May 10, 2008 at 08:33 AM Report Share #184260 Posted May 10, 2008 at 08:33 AM 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 More sharing options...
Knitter Posted May 10, 2008 at 01:13 PM Report Share #184290 Posted May 10, 2008 at 01:13 PM 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. www.sergiolopes.eu Link to comment Share on other sites More sharing options...
Rui Carlos Posted May 10, 2008 at 01:33 PM Report Share #184295 Posted May 10, 2008 at 01:33 PM 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. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
pedrosorio Posted May 10, 2008 at 01:52 PM Report Share #184299 Posted May 10, 2008 at 01:52 PM 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 More sharing options...
Knitter Posted May 29, 2008 at 10:51 AM Report Share #188273 Posted May 29, 2008 at 10:51 AM 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. www.sergiolopes.eu Link to comment Share on other sites More sharing options...
Rui Carlos Posted May 29, 2008 at 11:23 AM Report Share #188285 Posted May 29, 2008 at 11:23 AM [...] 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". Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Knitter Posted May 29, 2008 at 02:27 PM Report Share #188331 Posted May 29, 2008 at 02:27 PM 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. www.sergiolopes.eu Link to comment Share on other sites More sharing options...
pedrosorio Posted May 29, 2008 at 04:43 PM Report Share #188369 Posted May 29, 2008 at 04:43 PM 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 More sharing options...
Knitter Posted May 29, 2008 at 05:00 PM Report Share #188373 Posted May 29, 2008 at 05:00 PM 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. www.sergiolopes.eu Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now