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.h
etc.
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?
fonte
2^19937 − 1
. A semente é o ponto dessa sequência extremamente longa em que o gerador inicia. Então, sim, é determinístico.Respostas:
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:n x0,x1,...,xn−1
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.1⩽m⩽n r A
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
R
a 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.
fonte
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)
Às vezes, é útil definir uma semente. Alguns desses usos são os seguintes:
Ao programar e depurar , é conveniente ter uma saída previsível. Muitos programadores colocam uma
set.seed
declaração no início de um programa até que a gravação e a depuração sejam concluídas.Ao ensinar sobre simulação. Se eu quiser mostrar aos alunos que posso simular jogadas de um dado justo usando a
sample
funçã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
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.
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.
fonte
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.
fonte