paulo1205
(usa Ubuntu)
Enviado em 23/08/2016 - 20:39h
O tipo mais simples de fórmula para geração de número pseudo-aleatórios tem o seguinte aspecto.
x=x*A+B;
Ou seja, o próximo estado do gerador de número pseudo-aleatórios (PRNG) é uma função depende do estado atual.
“Semente” pode ser entendido como sinônimo do estado atual, mas geralmente se aplica esse nome apenas ao valor que você deliberadamente e manualmente define no estado do PRNG, que vai afetar os valores gerados posteriormente.
Nos PRNGs mais simples, a fórmula acima é exatamente o que se costuma usar. Os coeficientes
A e
B são números geralmente constantes e supostamente escolhidos a dedo para não provocar uma repetição muito frequente dos valores produzidos pela fórmula.
Para você ter uma ideia de como a coisa pode ser perigosamente simples, eis o PRNG usado no UNIX tradicional e em diversas implementações de várias plataformas, que já foi usado no Linux e que ainda é usado em alguns BSDs até hoje (embora a manpage recomende explicitamente não o usar, preferindo
random() -- fonte:
http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdlib/rand.c?rev=1.12&content-type=text/x-cvsw...).
static u_long next = 1; // <-- Esse aqui é o estado atual. O valor 1 é a semente default (se você omitir srand() no seu programa).
int rand(void){
return (int)((next = next * 1103515245 + 12345) % ((u_long)RAND_MAX + 1));
}
void srand(u_int seed){
next = seed;
}
Como você pode ver,
srand() apenas muda o valor atual da semente. E a fórmula do PRNG se revela uma porcaria, no fim das contas. Só para dar uma ideia da primariedade, a primeira coisa que qualquer pessoa pode ver é que os sucessivos números sorteados produzirão inexoravelmente usa sequência alternada de números pares e ímpares.
Felizmente, no Linux, hoje em dia,
rand() foi transformada num sinônimo de
random() (e
srand() em sinônimo de
srandom()).
A implementação de
random()/
srandom() também possui a figura da semente, mas em lugar de usar apenas um valor inteiro como estado para a geração de novos números, usa-se um vetor com vários elementos, e alguns desses elementos são combinados entre si, e depois modificados, a cada chamada feita a
random().
srandom(), por sua vez, coloca o valor da semente como um dos elementos do vetor, e depois chama
random() um número arbitrário de vezes, a fim de propagar os efeitos da nova semente pelos demais elementos do vetor.