Como eliminar todas as fontes de aleatoriedade para que o programa sempre dê respostas idênticas?
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?
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.