summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpasky <pasky@openttd.org>2005-03-06 22:28:35 +0000
committerpasky <pasky@openttd.org>2005-03-06 22:28:35 +0000
commit6902a8b2940e2bf885dd0eaad44c7d95d7b5ec87 (patch)
tree70de25930e42d03fba207cd384b0bf5f9c1bed8c
parentfeb907d22578831a6d11b515c570ec0d08d32efa (diff)
downloadopenttd-6902a8b2940e2bf885dd0eaad44c7d95d7b5ec87.tar.xz
(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.
-rw-r--r--misc.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/misc.c b/misc.c
index 188f3e87e..f317def5e 100644
--- a/misc.c
+++ b/misc.c
@@ -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)