(svn r1950) Fix: A slight adjustment in the DoRandom() function which however causes dramatic improvement in the distribution of random numbers.

With the original generator, e.g. Random()%44 on 100 attempts regularily
generated only 22 different values! With this adjustment, the distribution is
much more uniform, almost approaching the glibc's random() call.

This means the random numbers are actually usable i.e.  for the town names
generators which almost never tried a large part of the names while others were
very frequent.

Note that we attempted to test whether the randomness did not degrade in some
other way, and it came clean from the tests we performed. If you spot anything
fishy, try without this patch, though.
This commit is contained in:
pasky 2005-03-06 22:28:35 +00:00
parent feb907d225
commit 6902a8b294
1 changed files with 8 additions and 8 deletions

16
misc.c
View File

@ -49,20 +49,20 @@ uint32 t;
if (_current_player>=MAX_PLAYERS || !_networking) {
s = _random_seeds[0][0];
t = _random_seeds[0][1];
_random_seeds[0][0] = s + ROR(t ^ 0x1234567F, 7);
return _random_seeds[0][1] = ROR(s, 3);
_random_seeds[0][0] = s + ROR(t ^ 0x1234567F, 7) + 1;
return _random_seeds[0][1] = ROR(s, 3) - 1;
} else {
uint32 s = _player_seeds[_current_player][0];
uint32 t = _player_seeds[_current_player][1];
_player_seeds[_current_player][0] = s + ROR(t ^ 0x1234567F, 7);
_player_seeds[_current_player][0] = s + ROR(t ^ 0x1234567F, 7) + 1;
DEBUG(net, 1)("[NET-Seeds] Player seed called!");
return _player_seeds[_current_player][1] = ROR(s, 3);
return _player_seeds[_current_player][1] = ROR(s, 3) - 1;
}
#else
s = _random_seeds[0][0];
t = _random_seeds[0][1];
_random_seeds[0][0] = s + ROR(t ^ 0x1234567F, 7);
return _random_seeds[0][1] = ROR(s, 3);
_random_seeds[0][0] = s + ROR(t ^ 0x1234567F, 7) + 1;
return _random_seeds[0][1] = ROR(s, 3) - 1;
#endif
}
@ -82,8 +82,8 @@ uint32 InteractiveRandom(void)
{
uint32 t = _random_seeds[1][1];
uint32 s = _random_seeds[1][0];
_random_seeds[1][0] = s + ROR(t ^ 0x1234567F, 7);
return _random_seeds[1][1] = ROR(s, 3);
_random_seeds[1][0] = s + ROR(t ^ 0x1234567F, 7) + 1;
return _random_seeds[1][1] = ROR(s, 3) - 1;
}
uint InteractiveRandomRange(uint max)