Acho que é mais fácil você, a partir do fonte das funções rand() e srand(), entender o que ocorre.
No meu compilador (Visual Studio 2005), rand() e srand() são definidas, respectivamente, como:
int __cdecl rand (void)
{
_ptiddata ptd = _getptd();
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );
}
void __cdecl srand (
unsigned int seed
)
{
_getptd()->_holdrand = (unsigned long)seed;
}
Se eu disser que _getptd()->_holdrand pode ser substituída por uma declaração como a seguinte:
static unsigned long holdrand = 0L;
e o código acima
você acredita?
Se acreditar, o código de srand e rand seria equivalente a:
int rand (void)
{
holdrand = (holdrand * 214013L + 2531011L);
return (holdrand >> 16) & 0x7fff;
}
void srand (
unsigned int seed
)
{
holdrand = (unsigned long)seed;
}
Você pode deduzir então que, se você não chamar srand com um número inicial qualquer (por exemplo, o horário atual em segundos), então o valor de holdrand vai ser zero, e o primeiro número retornado por rand() será 38 (faça as contas). O segundo valor será 30840, e assim por diante.