Como funcionam os geradores de números aleatórios?


23

Eu estava pensando sobre a rand()função php e pensando em como poderia refazê-la, e fiquei completamente estupido.

Como funcionam os geradores de números aleatórios?


2
Os geradores de números pseudo-aleatórios usam uma semente, uma tabela de constantes predefinidas e fórmulas matemáticas. Geradores de números aleatórios reais geralmente usam ruído atmosférico. Você pode facilmente obter números aleatórios lendo / dev / random.
rightfold

O ruído atmosférico é garantido como aleatório?


14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Neil

3
Alguém tem que fazer isso: xkcd.com/221 ;)
Valera Kolupaev

Respostas:


7

Os Geradores de Número Aleatório (RNGs) estão realmente gerando números pseudo-aleatórios, já que é impossível gerar um número aleatório VERDADEIRO. As únicas coisas realmente verdadeiramente aleatórias são atos de Deus, como um raio.

Este artigo da wikipedia pode ajudá-lo na explicação: http://en.wikipedia.org/wiki/Random_number_generators


Pelo que entendi, existem basicamente duas partes de um RNG: a semente e, em seguida, o número aleatório escolhido a partir dessa semente. Quando você semeia o RNG, está dando a ele o equivalente a um ponto de partida. Esse ponto de partida tem vários números "internos" que o programa escolhe. No PHP, você pode usar srand () para "embaralhar" as sementes, então quase sempre obtém uma resposta diferente. Você pode usar rand (min, max) para entrar na semente e escolher um número entre o mínimo e o máximo, inclusive.


AVISO, POSSÍVEL ANALOGIA QUEIJO À FRENTE!

Pense em cada 'semente' como uma caixa de gelo e, em seguida, os números aleatórios como cubos de gelo. Digamos que você tenha 1000 baús de gelo e cada baú tenha 1000 cubos de gelo dentro. Na feira do condado, eles escolhem um baú de gelo para começar a usar bebidas e só podem usar um cubo de gelo. No entanto, eles precisam apenas de cubos de gelo maiores que 1 polegada cúbica. Então eles escolherão um baú aleatoriamente entre esses 1000 baús e, em seguida, escolherão um cubo de gelo dentro desse baú aleatoriamente. Se funcionar para o tamanho desejado, eles o usarão. Caso contrário, eles o colocam de volta no peito com os outros. Se eles querem torná-lo um pouco mais divertido, eles trocam de baú de antemão para total esquecimento, se você quiser!

Quanto à forma como o PHP realmente escolhe fisicamente a semente e o número aleatório, eu não tenho conhecimento suficiente para isso (que é provavelmente o que você mais queria saber!). Eu não tentaria refazer a função rand (); para a maioria dos aplicativos baseados na Web que você cria, rand () deve ser suficiente para qualquer número aleatório necessário.

Verifique também os geradores congruenciais lineares; isso pode ser mais do que você está procurando se quiser os detalhes sujos: http://en.wikipedia.org/wiki/Linear_congruential_generator

Espero que isto ajude!


7
Como os atos de godser aleatório no mínimo? Além disso, o raio também não é aleatório, segue um caminho determinado por várias condições. Além disso, o intérprete que gera o número é essencialmente irrelevante.

7
Estou usando atos de Deus no sentido legal: en.wikipedia.org/wiki/Act_of_God Eles são considerados aleatórios, pois estão além do aparente controle humano.

4
Então, essencialmente, não há nada aleatório. Mas isso exigiria a cada ocorrência aparentemente aleatória a ser influenciado, que não funciona quando você chegar ao início do tempo .... Parece que eu vou tomar algumas aulas de filosofia = D

6
@Korvin, até onde sabemos, fenômenos quânticos como decaimento radioativo ou emissão de um fóton por um átomo excitado são genuinamente aleatórios. No entanto, matemáticos e filósofos argumentam o que significa ser genuinamente aleatório. E, embora as pessoas comuns pensem que o sorteio é bastante aleatório, os mágicos do estágio ágil ( news.stanford.edu/pr/2004/diaconis-69.html ) podem obter regularmente 10 cabeças em 10 movimentos.
Charles E. Grant,

1
@ Charles - Um sorteio nem é um cara / coroa binário, na verdade é cara / coroa / borda, então um mágico de palco realmente bom pode fazer com que ele não caia nem cara nem coroa. * 8 ')
Mark Booth

18

Eles geralmente não são verdadeiramente aleatórios, mas são chamados de pseudo-aleatórios porque geram uma sequência numérica que parece aleatória. Isso é feito com algumas fórmulas matemáticas interessantes. Um dos mais comuns é o gerador linear de congratulações .

Os números pseudo-aleatórios têm uma propriedade útil que os números aleatórios verdadeiros não têm: se você usar a mesma semente ao iniciar, receberá uma sequência idêntica. Isso pode ser muito útil para testes.


Se estou entendendo sua segunda afirmação corretamente: random(5332)sempre será igual a random(5332)?

2
@ Korvin, não, se você ligar srand(5332), o próximo número retornado por randsempre será o mesmo.
Mark Ransom

3
"parece aleatório" -> tem as mesmas propriedades estatísticas que números verdadeiramente aleatórios.

+1 para o link LGC Wikipedia, isso oferece uma excelente animação de por que os PRNGs simples têm sérias limitações ao fazer simulações multidimensionais de Monte Carlo.
Mark Booth

4

Você está pedindo Pseudo-Aleatório ou Aleatório? Outros responderam sobre pseudo-aleatório, deixe-me falar sobre Random.

Havia (existem?) Geradores de Números Aleatórios baseados em hardware reais à venda. Eles foram baseados em um chip com um pequeno rádio medindo o ruído branco da radiação do espaço profundo, ou uma pequena amostra radioativa e períodos de medição entre sua decadência. O problema com eles era a largura de banda - a quantidade de entropia que eles podiam gerar não era muito alta; portanto, eles eram usados ​​para sementes de algoritmos pseudo-aleatórios. Eles foram usados ​​em sistemas bancários, de alta segurança e afins.

OTOH, se você encontrar algum desenvolvedor de sistemas embarcados, eles rirão disso. Para propósitos comuns na programação de um microcontrolador, a leitura de 4 bits baixos de qualquer conversor analógico-digital de 16 bits com um pino flutuante (não conectado) produzirá um ruído aleatório perfeitamente bom, com largura de banda mais do que suficiente (quanto menor o período de pesquisa, mais " barulhento "na leitura) e mais fácil do que escrever a rotina RNG real. E considerando que os ADCs são comumente encontrados implementados em silício de microcontroladores, comumente implementados e geralmente implementados com 8 canais dos quais você precisa talvez 5 para seu aplicativo, é praticamente gratuito.

E mesmo se você não tiver um ADC, alguns elementos conectados a um pino GPIO digital produzirão um ruído muito bom. No incorporado, o ruído está sempre presente (e é constantemente combatido), e assim é muito fácil obter alguma aleatoriedade verdadeira.


2

Existem várias maneiras de tentar emular uma sequência "aleatória" de números. Sua primeira parada deve ser ler sobre geradores congruenciais lineares , com certeza. É assim que funcionam os geradores de números aleatórios mais básicos, e aposto que é como a função rand () do PHP funciona.

A próxima pergunta mais interessante a ser ponderada é como ela se propaga? Tempo? Endereço de IP? etc.


A semente é o que está me confundindo, não consigo pensar em nada que possa semear a função sem algum tipo de padrão e, mesmo que não, o que está causando a semente aleatória a ser gerada em primeiro lugar!

3
Acredito que um registro de data e hora é frequentemente usado como uma semente inicial quando nenhum é realmente fornecido de outra fonte. No antigo BASIC, RANDOMIZE TIMERera um idioma comum e "bom o suficiente" para a maioria dos propósitos (não criptográficos). De acordo com man 3 srand , a biblioteca GNU C usa uma semente fixa de 1 até que o PRNG seja repetido.
um CVn

1

Antes de tudo, praticamente todas as rand()funções não fornecem aleatoriedade verdadeira, mas fornecem os chamados números pseudo-aleatórios.

Então, como funcionam os geradores de números pseudo-aleatórios? Basicamente da mesma maneira que a criptografia funciona: você tem uma função (um hash) que recebe alguma entrada e produz uma saída de uma maneira tão complexa que é impossível da saída adivinhar a entrada ou vice-versa. Ou seja, todo código pode ser usado para criar um gerador pseudo-aleatório bastante bom. No entanto, embora você possa usar qualquer gerador pseudo-aleatório para fazer criptografia em princípio, a maioria dos geradores de números pseudo-aleatórios são desenvolvidos principalmente para velocidade, não para segurança criptográfica, para que não causem dor de cabeça aos hackers.

Para um gerador pseudo-aleatório, a função de hash é aplicada a algum estado interno oculto do gerador e sua saída é usada para a) modificar esse estado interno eb) para calcular a saída da rand()função. A próxima invocação de rand()usará esse estado interno alterado e, portanto, produzirá um resultado diferente. Quanto melhor a função hash, menos facilmente os resultados são distinguíveis dos números aleatórios verdadeiros.


De fato, hoje em dia, os computadores têm acesso a números aleatórios reais: eles se originam da instabilidade no tempo das interrupções produzidas por dispositivos externos. O Linux usa esses valores de pequena incerteza para agitar constantemente um "pool de entropia", que é apenas alguns kilobytes de estado interno. Os hashes criptográficos baseados nesse pool de entropia são disponibilizados pelos dispositivos /dev/randome /dev/urandom. Portanto, o acesso a alguns números aleatórios realmente bons é tão simples quanto abrir um desses dois dispositivos e ler alguns bytes deles.


-2

Números aleatórios são números gerados pelo processo cuja saída é imprevisível. ou seja, não podemos dizer o que será a próxima saída. Podemos dar um exemplo simples de resultado dos dados. O que será produzido quando jogarmos um dado é imprevisível.

Existem dois tipos de Número aleatório 1. Números aleatórios verdadeiros 2. Números pseudo-aleatórios.

Como os números aleatórios são gerados


1
Use a formatação de cotação para destacar quais partes da resposta são suas e quais são da fonte citada. Se a sua resposta for apenas copiar / colar de uma fonte externa, não é uma boa resposta aqui.
Mat

este não parece oferecer nada substancial sobre pontos feitos e explicado em anteriores 6 respostas
mosquito
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.