Ya he averiguado el comportamiento completo de Rnd():
long long seed = 0x50000L;
float rnd (float number)
{
unsigned char* byte;
long long result;
if (number > 0)
{
seed = (seed * 0x43fd43fdLL + 0xc39ec3LL) & 0xffffffLL;
}
else if (number < 0)
{
byte = (unsigned char *) &number;
result = (byte[2] << 16) + (byte[1] << 8) + byte[0] + byte[3];
seed = (result * 0x43fd43fdLL + 0xc39ec3LL) & 0xffffffLL;
}
return (float) seed / (float) 16777216.0;
}
Es necesario usar el tipo long long, pues en la multiplicación se puede producir desbordamiento.
Esta versión de Rnd() funciona exactamente igual que la de Visual Basic; al menos es lo que parece tras realizar múltiples pruebas (0, positivos, negativos...).
Respecto a Randomize(), no tengo ni idea de por donde pillarla.
Saludos.