"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Os números aleatórios em computadores são realmente aleatórios? Versão JS

Os números aleatórios em computadores são realmente aleatórios? Versão JS

Postado em 2025-04-13
Navegar:337

Entendendo a aleatoriedade simulada de JavaScript: um mergulho profundo em math.random ()

A geração aparentemente sem esforço de números aleatórios na programação geralmente mascara a complexidade subjacente, especialmente considerando a natureza inerentemente determinística dos computadores. Este artigo explora como o JavaScript simula a aleatoriedade usando Math.random () , revelando a mecânica por trás da geração do que percebemos como números aleatórios.

Is random numbers in computers are random at all? JS version

A ilusão da aleatoriedade na computação

computadores, em sua essência, execute instruções sequencialmente. Então, como eles produzem números que parecem aleatórios?

Is random numbers in computers are random at all? JS version

Geradores de números-random pseudo-random (prngs)

A "Randomidade" fornecida por Math.random () não é verdadeiramente aleatória; É pseudo-aleatório. Os geradores de números pseudo-aleatórios (PRNGs) empregam algoritmos matemáticos para criar sequências de números exibindo comportamento aleatório.

características -chave dos prngs:

  1. Valor da semente: Um valor inicial (a semente) inicia a sequência numérica. A semente dita a sequência inteira.
  2. Comportamento determinístico: conhecendo o algoritmo e semente permite a previsão de toda a sequência de números.
  3. periodicidade: prngs inevitavelmente repetem suas seqüências após um número específico de iterações.

javascript's Math.random () normalmente utiliza algoritmos como XorShift ou Mersenne Twister (o algoritmo preciso depende do mecanismo JavaScript, como V8 no Chrome).

Is random numbers in computers are random at all? JS version

decodificando Math.random ()

Math.random () é o principal gerador de números aleatórios do JavaScript. Funciona da seguinte maneira:

produz um número de ponto flutuante entre 0 (inclusive) e 1 (exclusivo).
Exemplos incluem 0,2315601941492, 0,6874206142281 ou 0,9912760919023.

// Random number between 0 and 1
console.log(Math.random());

// Random integer between 0 and 9
console.log(Math.floor(Math.random() * 10));

// Random number between 1 and 100
console.log(Math.floor(Math.random() * 100)   1);
...

O processo envolve estas etapas:

Um valor inicial de semente é usado. Esta semente é frequentemente derivada do relógio do sistema ou de outra fonte única.

O algoritmo aplica transformações matemáticas à semente para criar um novo número.
  1. Este novo número é dividido por uma grande constante (para normalização entre 0 e 1).
  2. Este processo se repete para cada chamada para
  3. Math.random ()
  4. , gerando o próximo número na sequência.
  5. Esta sequência previsível (dada a semente) o torna adequado para simulações e jogos, mas inadequado para aplicações criptográficas.
  6. Por que a verdadeira aleatoriedade permanece ilusória

Math.random ()

O algoritmo determinístico de S significa que sua sequência é reproduzível se a semente e o algoritmo forem conhecidos. Para tarefas sensíveis à segurança, como criptografia, números aleatórios criptograficamente seguros são essenciais, gerados usando a API da Web Crypto:

// valores aleatórios criptograficamente seguros const array = novo uint32Array (5); window.crypto.getrandomValues ​​(Array); console.log (Array);

// Cryptographically secure random values
const array = new Uint32Array(5);
window.crypto.getRandomValues(array);
console.log(array);

A natureza binária dos computadores (0s e 1s) entra em conflito com a incerteza inerente à aleatoriedade. Para simular a aleatoriedade efetivamente:

Is random numbers in computers are random at all? JS version

fontes externas:

Os sistemas geralmente usam dados externos imprevisíveis (movimentos de mouse, pressionamentos de teclas, relógio do sistema) para valores de sementes.
  1. Pools de entropia: Os sistemas operacionais mantêm pools de entropia, coletando ruído de várias fontes para aprimorar a aleatoriedade.
  2. Conclusão: uma ilusão necessária
  3. A aleatoriedade em computadores é uma ilusão cuidadosamente construída, dependente de algoritmos sofisticados e sementes iniciais. Enquanto
Math.random ()

é prático para muitas aplicações, suas limitações e natureza determinística devem ser reconhecidas. Para segurança e verdadeira aleatoriedade, são necessários métodos criptográficos.

Vamos apreciar a interação intrigante entre determinismo e a aleatoriedade simulada que impulsiona nosso código!

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3