Eu estava pensando sobre a função php rand()
e pensando em como poderia refazê-la e vim completamente estupefato.
Como funcionam os geradores de números aleatórios?
Comentários
Resposta
Geradores de números aleatórios (RNGs) estão realmente gerando números pseudo-aleatórios, já que é impossível gerar um número VERDADEIRAMENTE aleatório. As únicas coisas realmente 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 é equivalente a um PO inicial int. Esse ponto de partida tem então um monte de números que estão “dentro” dele e que o programa escolhe. No PHP, você pode usar srand () para “embaralhar” as sementes, de modo que quase sempre obtenha uma resposta diferente. Você pode então usar rand (min, max) para ir para a semente e escolher um número entre o mínimo e o máximo, inclusive.
AVISO, POSSÍVEL ANALOGIA DE 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ú contenha 1000 cubos de gelo dentro. Na feira do condado, eles escolherão um baú de gelo para começar a usar para bebidas e só podem usar um cubo de gelo. No entanto, eles só precisam de cubos de gelo maiores que 1 polegada cúbica. Então, eles escolherão um baú aleatoriamente entre os 1000 baús e, em seguida, escolherão um cubo de gelo dentro desse baú aleatoriamente. Se funcionar para o tamanho que eles desejam, eles o usam. Se não for, eles colocam de volta no baú com os outros. Se eles querem torná-lo um pouco mais divertido, eles trocam os baús de antemão para o esquecimento total, se você quiser!
Quanto ao PHP na verdade, escolhe fisicamente a semente e o número aleatório, não tenho conhecimento suficiente para isso (que é provavelmente o que você mais estava pensando!). Eu não tentaria refazer a função rand (); para a maioria dos aplicativos baseados na web que você fará, rand () deve ser suficiente para qualquer número aleatório que você precise.
Verifique também a congruência linear geradores, pode ser mais do que você está procurando se quiser os detalhes sujos: http://en.wikipedia.org/wiki/Linear_congruential_generator
Espero que isso ajude!
Comentários
- Como os atos de
god
seriam aleatórios no mínimo? Além disso, o raio não é ‘ t aleatório, ele segue um caminho determinado por várias condições. Além disso, o intérprete que gera o número é essencialmente irrelevante. - Eu ‘ m 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 controle humano aparente.
- Então, essencialmente, não há nada que seja aleatório. Mas isso exigiria que cada ocorrência aparentemente aleatória fosse influenciada, o que não ‘ funciona quando você chega bem no início dos tempos … Parece que eu ‘ vou fazer algumas aulas de filosofia = D
- @Korvin, até onde sabemos, fenômenos quânticos como decaimento radioativo ou a 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 de palco ágeis ( news.stanford.edu/pr/2004/diaconis-69.html ) podem regularmente obtenha 10 caras em 10 lançamentos.
- @Charles – O cara ou coroa não é ‘ nem mesmo um binário cara / coroa, é ‘ s realmente cara / coroa / borda, então um mágico de palco realmente bom poderia fazer com que não desse cara nem coroa. * 8 ‘)
Resposta
Eles geralmente são não verdadeiramente aleatórios, mas são chamados de pseudoaleatórios porque geram uma sequência numérica que parece aleatória. Isso é feito com algumas fórmulas matemáticas interessantes. Uma das mais comuns é a Congruencial Linear Gerador .
Os números pseudo-aleatórios têm uma propriedade útil que os verdadeiros números aleatórios não têm: se você usar a mesma semente quando começar, receberá de volta uma sequência idêntica. Isso pode ser muito útil para testes.
Comentários
- Se eu ‘ estiver entendendo sua segunda afirmação corretamente:
random(5332)
será sempre igual arandom(5332)
? - @Korvin, não, quero dizer, se você chamar
srand(5332)
então o próximo número retornado porrand
será sempre o mesmo. - ” aparece aleatório ” – > têm as mesmas propriedades estatísticas que números verdadeiramente aleatórios.
- +1 para o link LGC da Wikipedia, tem um excelente animação de por que PRNGs simples têm sérias limitações ao fazer simulações de Monte-carlo multidimensionais.
Resposta
São y Você está perguntando por Pseudorandom ou Random? 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 eram 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 medindo os períodos 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, então eles foram usados para sementes de algoritmos pseudo-aleatórios. Eles eram usados em sistemas bancários, alta segurança e similares.
OTOH, se você encontrar qualquer desenvolvedor de sistemas embarcados, eles vão rir deles. Para propósitos comuns na programação de um microcontrolador, a leitura de 4 bits de qualquer conversor analógico-digital de 16 bits com um pino flutuante (desconectado) produzirá um pino perfeitamente bom ruído aleatório, em largura de banda mais do que suficiente (quanto mais curto o período de votação, mais “ruidosa” a 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 frequentemente implementados com 8 canais dos quais talvez você precise de 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 bom ruído. Em incorporado, o ruído é ev er-presente (e constantemente lutado), e assim obter alguma aleatoriedade verdadeira é muito fácil.
Resposta
Existem muitas maneiras para 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 é assim que funciona a função rand () do PHP.
A próxima pergunta mais interessante a se ponderar é como ela se propaga? ? Endereço IP? Etc.
Comentários
- A semente é o que está me confundindo, eu posso ‘ Não pense em qualquer coisa que possa propagar a função sem algum tipo de padrão, e mesmo se não, então o que está causando a propagação aleatória para ser gerada em primeiro lugar!
- Eu acredito que um carimbo de data / hora é frequentemente usado como uma semente inicial quando nenhum é realmente fornecido de alguma outra fonte. No BASIC antigo,
RANDOMIZE TIMER
era 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 um semente fixa de 1 até que o PRNG seja propagado novamente.
Resposta
Primeiro de tudo, virtualmente todos rand()
funções não fornecem aleatoriedade verdadeira, em vez disso, 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 pega alguma entrada e produz alguma saída de uma maneira tão complexa que é impossível adivinhar a entrada a partir da saída ou vice-versa. Ou seja, cada cifra pode ser usada 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úmero pseudo-aleatório são desenvolvidos principalmente para velocidade, não segurança criptográfica, então eles não dará aos hackers nenhuma dor de cabeça.
Para um gerador pseudo-aleatório, a função de hashing é aplicada a algum estado interno oculto do gerador e sua saída é usada para a) modificar esse estado interno e b) para calcular a saída da função rand()
. A próxima chamada de rand()
usará esse estado interno alterado e, portanto, produzirá um resultado diferente. Quanto melhor for a função hash, menos facilmente os resultados serão distinguidos dos verdadeiros números aleatórios.
Na verdade, os computadores hoje em dia têm acesso a números reais aleatórios: eles se originam do jitter no tempo de 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. Hashes criptográficos baseados neste pool de entropia são disponibilizados por meio dos dispositivos /dev/random
e /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.
Resposta
Números aleatórios são números gerados pelo processo cuja saída é imprevisível. ou seja, não podemos dizer qual será a próxima saída. Podemos pegar alguns resultados de exemplo simples dos dados. O que sairá quando lançarmos um dado é imprevisível.
Existem dois tipos de Número Aleatório 1. Números aleatórios verdadeiros 2. Números pseudoaleatórios.
Como os números aleatórios são gerados
Comentários
- Use a formatação de citação para destacar quais partes do as respostas são suas e provenientes da fonte que você cita. Se toda a sua resposta for copiar / colar de uma fonte externa, ‘ não é uma boa resposta aqui.
- isso não ‘ não parece oferecer nada substancial sobre os pontos feitos e explicados nas 6 respostas anteriores
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }