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.