Como eliminar todas as fontes de aleatoriedade para que o programa sempre dê respostas idênticas?

StackOverflow https://stackoverflow.com/questions/3435595

  •  26-09-2019
  •  | 
  •  

Pergunta

Eu tenho código C ++ que depende fortemente da amostragem (usando rand ()), mas quero que seja reproduzível. Então, no começo, inicializo Srand () com uma semente aleatória e imprimirá essa semente. Quero que os outros possam executar o mesmo código novamente, mas inicializando o SRand () com a mesma semente e obtenha exatamente a mesma resposta que eu.

Mas em que circunstâncias isso é garantido? Suponho que funcione apenas se os binários forem compilados com o mesmo compilador no mesmo sistema? Quais são os outros fatores que podem fazer com que a resposta seja diferente daquele que recebi inicialmente?

Foi útil?

Solução

A solução é usar o mesmo código em todos os casos - a biblioteca de números aleatórios do Boost é infinitamente melhor do que qualquer implementação da biblioteca padrão C ++ e você pode usar o mesmo código em todas as plataformas. Dar uma olhada em essa questão Por exemplo, de seu uso e links para os documentos da biblioteca.

Outras dicas

Você está certo de que as seqüências podem ser diferentes se compiladas em diferentes máquinas com diferentes rand implementações. A melhor maneira de contornar isso é escrever seu próprio PRNG. A página do Linux Man para srand Dá o seguinte exemplo simples (citado no padrão POSIX):

Posix.1-2001 fornece o seguinte exemplo de implementação de rand () e srand (), possivelmente útil quando se precisa da mesma sequência em duas máquinas diferentes.

 static unsigned long next = 1;

 /* RAND_MAX assumed to be 32767 */
 int myrand(void) {
     next = next * 1103515245 + 12345;
     return((unsigned)(next/65536) % 32768);
 }

 void mysrand(unsigned seed) {
     next = seed;
 }

Para evitar esse tipo de problema, escreva sua própria implementação de rand()! Não sou especialista em algoritmos de geração de números aleatórios, então não vou dizer não mais do que isso ...

Verificação de saída Implementação de Rand (), e use um dos geradores de números aleatórios a partir daí - o que garante a repetibilidade, independentemente da plataforma que você execute.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top