Por 6 anos, tive uma página de gerador de números aleatórios em meu site. Por muito tempo, foi o primeiro ou o segundo resultado no Google para "gerador de números aleatórios" e tem sido usado para decidir dezenas, senão centenas de concursos e desenhos em fóruns de discussão e blogs (eu sei porque vejo os referenciadores em meu web logs e geralmente dá uma olhada).
Hoje, alguém me enviou um e-mail dizendo que pode não ser tão aleatório quanto eu pensava. Ela tentou gerar números aleatórios muito grandes (por exemplo, entre 1 e 10000000000000000000) e descobriu que eles eram quase sempre o mesmo número de dígitos. Na verdade, envolvi a função em um loop para que pudesse gerar milhares de números e, com certeza, para números muito grandes, a variação era de apenas 2 ordens de magnitude.
Por quê?
Aqui está a versão em loop, para que você possa experimentá-la:
http://andrew.hedges.name/experiments/random/randomness.html
Inclui uma implementação direta tirada da Mozilla Developer Network e algum código de 1997 que eu peguei de uma página da web que não existe mais ("Central Randomizer 1.3" de Paul Houle). Veja a fonte para ver como cada método funciona.
Eu li aqui e em outros lugares sobre Mersenne Twister. Estou interessado em saber por que não haveria maior variação nos resultados da função Math.random integrada do JavaScript . Obrigado!
fonte
Respostas:
Dados números entre 1 e 100.
Dados números entre 1 e 1000.
e assim por diante.
Portanto, se você selecionar alguns aleatoriamente, a grande maioria dos números selecionados terá o mesmo número de dígitos, porque a grande maioria dos valores possíveis terá o mesmo número de dígitos.
fonte
Seus resultados são realmente esperados. Se os números aleatórios forem uniformemente distribuídos em um intervalo de 1 a 10 ^ n, você esperaria que cerca de 9/10 dos números tivessem n dígitos e outros 9/100 tivessem n-1 dígitos.
fonte
Existem diferentes tipos de aleatoriedade. Math.random oferece uma distribuição uniforme de números.
Se você quiser diferentes ordens de magnitude, sugiro usar uma função exponencial para criar o que é chamado de distribuição de lei de potência :
Esta função deve fornecer aproximadamente o mesmo número de números de 1 dígito que números de 2 dígitos e números de 3 dígitos.
Existem também outras distribuições para números aleatórios, como a distribuição normal (também chamada de distribuição Gaussiana).
fonte
minimum = 1
omaximum = 10
e oe às vezes obtive 11 como resultado. Você provavelmente pretendia usar emMath.floor
vez deMath.round
Parece perfeitamente aleatório para mim! (Dica: Depende do navegador.)
Pessoalmente, acho que minha implementação seria melhor, embora eu tenha roubado do XKCD , que SEMPRE deve ser reconhecido:
fonte
O artigo a seguir explica como math.random () nos principais navegadores da Web é (não) seguro: "Rastreamento temporário do usuário nos principais navegadores e vazamento e ataques de informações entre domínios" por Amid Klein (2008) . Não é mais forte do que as funções PRNG integradas de Java ou Windows típicas.
Por outro lado, a implementação do SFMT do período 2 ^ 19937-1 requer 2.496 bytes do estado interno mantido para cada sequência PRNG. Algumas pessoas podem considerar isso um custo imperdoável.
fonte
Se você usar um número como 10000000000000000000, estará ultrapassando a precisão do tipo de dados que o Javascript está usando. Observe que todos os números gerados terminam em "00".
fonte
Eu tentei o gerador de números pseudoaleatórios JS no Chaos Game .
Meu triângulo Sierpiński diz que é bastante aleatório:
fonte
Bem, se você está gerando números até, digamos, 1e6, com sorte obterá todos os números com probabilidade aproximadamente igual. Isso também significa que você só tem uma chance em dez de obter um número com um dígito a menos. Uma chance em cem de obter dois dígitos a menos, etc. Duvido que você veja muita diferença ao usar outro RNG, porque você tem uma distribuição uniforme entre os números, não seu logaritmo.
fonte
Números não aleatórios uniformemente distribuídos de 1 a N têm a mesma propriedade. Observe que (em certo sentido) é uma questão de precisão. Uma distribuição uniforme em 0-99 (como inteiros) tem 90% dos seus números com dois dígitos. Uma distribuição uniforme em 0-999999 tem 905 de seus números com cinco dígitos.
Qualquer conjunto de números (sob algumas condições não muito restritivas) tem uma densidade. Quando alguém deseja discutir números "aleatórios", a densidade desses números deve ser especificada (conforme observado acima). Uma densidade comum é a densidade uniforme. Existem outras: a densidade exponencial, a densidade normal, etc. Deve-se escolher qual densidade é relevante antes de propor um gerador de números aleatórios. Além disso, os números provenientes de uma densidade podem ser facilmente transformados em outra densidade por meios cariados.
fonte