O que exatamente é uma semente em um gerador de números aleatórios?


21

Eu tentei algumas pesquisas usuais no google, etc., mas a maioria das respostas que encontrei é um tanto ambígua ou específica de linguagem / biblioteca, como Python ou C ++ stdlib.hetc.

Como exemplo, muitos dizem que a semente é um ponto de partida do gerador de números aleatórios e a mesma semente sempre produz o mesmo número aleatório. O que isso significa? Isso significa que o número de saída é uma função determinística de uma semente específica e a aleatoriedade vem do valor da semente? Mas se for esse o caso, fornecendo a semente, não somos nós, os programadores, criando a aleatoriedade em vez de deixar a máquina fazer isso?

Além disso, o que significa um ponto de partida nesse contexto? Essa é uma maneira não rigorosa de dizer um elemento do domínio de um mapa ? Ou estou entendendo algo errado?xXf:XY


7
Não me sinto qualificado para escrever uma resposta, mas você pode encontrar o artigo da Wikipedia sobre o Mersenne Twister esclarecedor, especialmente a seção sobre inicialização . Em resumo, um gerador de números pseudo-aleatórios como o Mersenne Twister acabará repetindo sua saída. No caso do MT, o período tem duração 2^19937 − 1. A semente é o ponto dessa sequência extremamente longa em que o gerador inicia. Então, sim, é determinístico.
IonicSolutions

1
Um gerador de números pseudo-aleatórios é uma lista fixa de números que se repete infinitamente. Por onde começa? Você pode dizer.
whuber

2
@whuber Na verdade, acho que seu comentário seria uma ótima resposta.
David Z

Respostas:


22

A maioria dos geradores de números pseudoaleatórios (PRNGs) são construídos em algoritmos que envolvem algum tipo de método recursivo a partir de um valor base que é determinado por uma entrada chamada "semente". O PRNG padrão na maioria dos softwares estatísticos (R, Python, Stata etc.) é o algoritmo Mersenne Twister MT19937, estabelecido em Matsumoto e Nishimura (1998) . Esse é um algoritmo complicado, portanto, seria melhor ler o artigo, se você quiser saber como ele funciona em detalhes. Nesse algoritmo específico, há uma relação de recorrência de grau , e sua semente de entrada é um conjunto inicial de vetores . O algoritmo usa uma relação de recorrência linear que gera:nx0,x1,...,xn1

xn+k=f(xk,xk+1,xk+m,r,A),

onde e e são objectos que podem ser especificados como parâmetros do algoritmo. Como a semente fornece o conjunto inicial de vetores (e dados outros parâmetros fixos para o algoritmo), a série de números pseudo-aleatórios gerados pelo algoritmo é fixa. Se você alterar a semente, alterará os vetores iniciais, o que altera os números pseudo-aleatórios gerados pelo algoritmo. Essa é, obviamente, a função da semente.1mnrA

Agora, é importante observar que este é apenas um exemplo, usando o algoritmo MT19937. Existem muitos PRNGs que podem ser usados ​​em software estatístico, e cada um deles envolve métodos recursivos diferentes; portanto, a semente significa algo diferente (em termos técnicos) em cada um deles. Você pode encontrar uma biblioteca de PRNGs para Ra esta documentação , que lista os algoritmos disponíveis e os documentos que descrevem esses algoritmos.

O objetivo da semente é permitir que o usuário "bloqueie" o gerador de números pseudo-aleatórios, para permitir análises replicáveis. Alguns analistas gostam de definir a semente usando um verdadeiro gerador de número aleatório (TRNG), que usa entradas de hardware para gerar um número inicial de sementes e, em seguida, relata isso como um número bloqueado. Se a semente for definida e relatada pelo usuário original, o auditor poderá repetir a análise e obter a mesma sequência de números pseudo-aleatórios que o usuário original. Se a semente não estiver definida, o algoritmo geralmente utilizará algum tipo de semente padrão (por exemplo, a partir do relógio do sistema), e geralmente não será possível replicar a randomização.


+1. Seria bom acrescentar o que (normalmente) acontece se não for fornecido explicitamente a semente.
Ameba diz Reinstate Monica

1
@amoeba: O quarto parágrafo da minha resposta discute isso brevemente.
precisa saber é

1
Embora isso responda ao básico da questão, ele não toca no fato de que precisamos disso em simulações. É muito difícil produzir aleatoriedade VERDADEIRA - e quando você tem isso, não pode reproduzir a resposta original! Entre no PNRG ... com todos os seus problemas.
Paul Palmpje

@amoeba: Conforme solicitado, adicionei um parágrafo adicional para esclarecer isso.
Reintegrar Monica

1
Obrigado. "Seed padrão" soa um pouco como se sempre fosse o mesmo valor padrão de seed; o que eu quis dizer é que geralmente a semente é retirada do relógio do sistema. Acho que é bom saber disso.
Ameba diz Reinstate Monica

16

Primeiro, não há aleatoriedade verdadeira nos "números aleatórios" gerados por computador de hoje. Todos os geradores pseudo-aleatórios usam métodos determinísticos. (Possivelmente, os computadores quânticos mudarão isso.)

A tarefa difícil é inventar algoritmos que produzem resultados que não podem ser significativamente diferenciados dos dados provenientes de uma fonte verdadeiramente aleatória.

Você está certo que definir uma semente o inicia em um ponto de partida conhecido em uma longa lista de números pseudo-aleatórios. Para os geradores implementados em R, Python e assim por diante, a lista é imensamente longa. Tempo suficiente para que nem mesmo o maior projeto de simulação viável exceda o 'período' do gerador, para que os valores comecem a reciclar.

Em muitas aplicações comuns, as pessoas não estabelecem uma semente. Em seguida, uma semente imprevisível é selecionada automaticamente (por exemplo, nos microssegundos no relógio do sistema operacional). Os geradores pseudo-aleatórios em uso geral foram submetidos a baterias de testes, consistindo em grande parte de problemas que provaram ser difíceis de simular com geradores insatisfatórios anteriores.

Normalmente, a saída de um gerador consiste em valores que, para fins práticos, não são distinguíveis dos números escolhidos verdadeiramente aleatoriamente na distribuição uniforme emEm seguida, esses números pseudo-aleatórios são manipulados para corresponder ao que seria obtido aleatoriamente em outras distribuições, como binomial, Poisson, normal, exponencial etc.(0,1).

Um teste de um gerador é verificar se seus pares sucessivos em 'observações' simuladas como realmente parecem estar preenchendo a unidade ao quadrado aleatoriamente. (Feito duas vezes abaixo.) A aparência levemente marmorizada é resultado da variabilidade inerente. Seria muito suspeito obter uma trama que parecesse perfeitamente uniformemente cinza. [Em algumas resoluções, pode haver um padrão de moiré regular; altere a ampliação para cima ou para baixo para se livrar desse efeito falso, se ocorrer.]Unif(0,1)

set.seed(1776);  m = 50000
par(mfrow=c(1,2))
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
par(mfrow=c(1,1))

insira a descrição da imagem aqui

Às vezes, é útil definir uma semente. Alguns desses usos são os seguintes:

  1. Ao programar e depurar , é conveniente ter uma saída previsível. Muitos programadores colocam uma set.seeddeclaração no início de um programa até que a gravação e a depuração sejam concluídas.

  2. Ao ensinar sobre simulação. Se eu quiser mostrar aos alunos que posso simular jogadas de um dado justo usando a samplefunção em R, eu poderia trapacear, executando muitas simulações e escolhendo a que mais se aproxima de um valor teórico alvo. Mas isso daria uma impressão irreal de como a simulação realmente funciona.

    Se eu definir uma semente no início, a simulação sempre terá o mesmo resultado. Os alunos podem revisar sua cópia do meu programa para garantir que ele dê os resultados pretendidos. Em seguida, eles podem executar suas próprias simulações, com suas próprias sementes ou deixando o programa escolher seu próprio ponto de partida.

    Por exemplo, a probabilidade de obter o total de 10 ao dois dados justos éCom um milhão de experimentos com 2 dados, devo obter precisão de dois ou três pontos. A margem de 95% de erro de simulação é de cerca de

    3/36=1/12=0.08333333.
    2(1/12)(11/12)/106=0.00055.
    set.seed(703);  m = 10^6
    s = replicate( m, sum(sample(1:6, 2, rep=T)) )
    mean(s == 10)
    [1] 0.083456         # aprx 1/12 = 0.0833
    2*sd(s == 10)/sqrt(m)
    [1] 0.0005531408     # aprx 95% marg of sim err.
    
  3. Ao compartilhar análises estatísticas que envolvem simulação. Atualmente, muitas análises estatísticas envolvem alguma simulação, por exemplo, um teste de permutação ou um amostrador de Gibbs. Ao mostrar a semente, você permite que as pessoas que leem a análise replicem os resultados exatamente, se desejarem.

  4. Ao escrever artigos acadêmicos envolvendo randomização. Os artigos acadêmicos geralmente passam por várias rodadas de revisão por pares. Uma plotagem pode usar, por exemplo, pontos de tremulação aleatória para reduzir a plotagem. Se as análises precisarem ser levemente alteradas em resposta aos comentários do revisor, é bom que um tremor específico não relacionado não seja alterado entre as rodadas de revisão, o que pode ser desconcertante para os revisores particularmente cuidadosos, para que você defina uma semente antes do tremor.


1
Muito bom, +1. Tomei a liberdade de acrescentar um quarto ponto.
S. Kolassa - Restabelece Monica

Então você quer dizer que um gerador de números pseudo-aleatórios basicamente armazena uma sequência periódica de número aleatório (distribuído uniformemente em [0, 1]) e uma semente é apenas um índice para a sequência? Então, isso significa que o número aleatório gerado é uma função determinística da semente?
Della

9
Você não precisa de computador quântico a fenômenos quânticos uso de ter um gerador aleatório ( en.wikipedia.org/wiki/Hardware_random_number_generator )
Guiroux

1
@Della. Você tem essencialmente a ideia certa. Mas, por favor, entenda que, na prática, o "período" deve ser realmente enorme. (Não importa o tamanho do seu projeto de simulação, você não deseja que ele repita.) Por exemplo, a IonicSolutions comenta após o Q que o gerador Mersenne Twilster possui o período um pouco maior do que eu posso visualizar facilmente. // Se você conhece a semente, pode produzir o pseudo-aleatório seq a partir daí. // Geradores foram usados ​​para criptografar mensagens. Mas os padrões para geradores seguros para criptografia são diferentes dos padrões para geradores para simulação de probabilidade. 2199371,
BruceET

@Guiroux. A possibilidade que eu estava tentando mencionar computadores quânticos era ter geradores de números aleatórios verdadeiros tão rápido quanto os geradores pseudo-aleatórios de hoje. Na década de 1950, fontes de números aleatórios 'verdadeiros' foram usadas para randomização em delineamento experimental e para simulações prob (lentas, limitadas). Talvez veja milhões de dígitos aleatórios .
precisa saber é

0

TL; DR;

Uma semente geralmente permite reproduzir a sequência de números aleatórios. Nesse sentido, eles não são números aleatórios verdadeiros, mas "números pseudo-aleatórios", portanto, um PNR Generator (PNRG). Esta é uma ajuda real na vida real!

Um pouco mais detalhadamente:

Praticamente todos os geradores de números "aleatórios" implementados em linguagens de computador são geradores de números pseudo-aleatórios. Isso ocorre porque, dado um valor inicial (===> a semente), eles sempre fornecerão a mesma sequência de resultados pseudo-aleatórios. Um bom gerador produzirá uma sequência que não pode ser distinguida - em termos estatísticos - de uma sequência aleatória verdadeira (jogue um dado verdadeiro, uma moeda verdadeira, etc.).

Em muitos casos de simulação, você deseja ter uma verdadeira experiência "aleatória". No entanto, você também deseja reproduzir seus resultados. Por quê? Bem, pelo menos os reguladores estão interessados ​​nessa coisa peculiar.

Há muito o que mergulhar. As pessoas até fazem análises das "melhores" sementes aleatórias. Na minha opinião, isso invalida o modelo, pois eles não conseguem lidar com o comportamento aleatório "verdadeiro" - ou o PRNG não é adequado para sua implementação. Na maioria das vezes, eles simplesmente não fazem simulações suficientes - mas levam tempo.

Agora imagine um RNG "verdadeiro". Pode-se implementar isso com base em um tipo de aleatoriedade na máquina. Se você pegar apenas uma semente aleatória (por exemplo, tempo agora), criará um tipo de ponto de partida aleatório, mas a aleatoriedade da sequência ainda depende do algoritmo para determinar os próximos números. Isso é mais importante que o ponto de partida na maioria dos casos, pois a distribuição dos resultados determina o "resultado" real. Se sua sequência fosse verdadeiramente aleatória, como você implementaria isso? Pode-se dizer que os tiques do relógio de um computador são determinísticos e, provavelmente, provavelmente mostrarão muita correlação automática. Então o que você pode fazer? A melhor aposta até agora é implementar um PNRG sólido.

Computação quântica? Não tenho certeza de que irá consertar isso.

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.