From e3fc31a512c6636777ab81a31eff789f2d4c64ff Mon Sep 17 00:00:00 2001 From: thilo Date: Sun, 31 May 2009 19:48:28 +0000 Subject: - Introduce seeding of the random number generator at startup - Replaced all engine-side occurances of rand() with random() git-svn-id: svn://svn.icculus.org/quake3/trunk@1561 edf5b092-35ff-0310-97b2-ce42778d08ea --- code/client/cl_main.c | 8 ++------ code/qcommon/common.c | 26 ++++++++++++++++++++++---- code/renderer/tr_noise.c | 6 ++---- code/server/sv_client.c | 2 +- code/server/sv_init.c | 3 +-- 5 files changed, 28 insertions(+), 17 deletions(-) diff --git a/code/client/cl_main.c b/code/client/cl_main.c index 01c044a..08ee747 100644 --- a/code/client/cl_main.c +++ b/code/client/cl_main.c @@ -1306,12 +1306,8 @@ void CL_RequestMotd( void ) { BigShort( cls.updateServer.port ) ); info[0] = 0; - // NOTE TTimo xoring against Com_Milliseconds, otherwise we may not have a true randomization - // only srand I could catch before here is tr_noise.c l:26 srand(1001) - // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=382 - // NOTE: the Com_Milliseconds xoring only affects the lower 16-bit word, - // but I decided it was enough randomization - Com_sprintf( cls.updateChallenge, sizeof( cls.updateChallenge ), "%i", ((rand() << 16) ^ rand()) ^ Com_Milliseconds()); + + Com_sprintf( cls.updateChallenge, sizeof( cls.updateChallenge ), "%i", (random() << 16) ^ random()); Info_SetValueForKey( info, "challenge", cls.updateChallenge ); Info_SetValueForKey( info, "renderer", cls.glconfig.renderer_string ); diff --git a/code/qcommon/common.c b/code/qcommon/common.c index e8a95a5..0f28072 100644 --- a/code/qcommon/common.c +++ b/code/qcommon/common.c @@ -2500,6 +2500,22 @@ static void Com_DetectAltivec(void) } +/* +================= +Com_InitRand +Seed the random number generator, if possible with an OS supplied random seed. +================= +*/ +static void Com_InitRand(void) +{ + unsigned int seed; + + if(Sys_Random(&seed, sizeof(seed))) + srand(seed); + else + srand(time(NULL)); +} + /* ================= Com_Init @@ -2519,8 +2535,11 @@ void Com_Init( char *commandLine ) { Com_Memset( &eventQueue[ 0 ], 0, MAX_QUEUED_EVENTS * sizeof( sysEvent_t ) ); Com_Memset( &sys_packetReceived[ 0 ], 0, MAX_MSGLEN * sizeof( byte ) ); - // do this before anything else decides to push events - Com_InitPushEvent(); + // initialize the weak pseudo-random number generator for use later. + Com_InitRand(); + + // do this before anything else decides to push events + Com_InitPushEvent(); Com_InitSmallZoneMemory(); Cvar_Init (); @@ -3322,8 +3341,7 @@ void Com_RandomBytes( byte *string, int len ) return; Com_Printf( "Com_RandomBytes: using weak randomization\n" ); - srand( time( 0 ) ); for( i = 0; i < len; i++ ) - string[i] = (unsigned char)( rand() % 255 ); + string[i] = (unsigned char)( random() % 255 ); } diff --git a/code/renderer/tr_noise.c b/code/renderer/tr_noise.c index 5d550a3..f27e6ab 100644 --- a/code/renderer/tr_noise.c +++ b/code/renderer/tr_noise.c @@ -44,12 +44,10 @@ void R_NoiseInit( void ) { int i; - srand( 1001 ); - for ( i = 0; i < NOISE_SIZE; i++ ) { - s_noise_table[i] = ( float ) ( ( ( rand() / ( float ) RAND_MAX ) * 2.0 - 1.0 ) ); - s_noise_perm[i] = ( unsigned char ) ( rand() / ( float ) RAND_MAX * 255 ); + s_noise_table[i] = ( float ) ( ( ( random() / ( float ) RAND_MAX ) * 2.0 - 1.0 ) ); + s_noise_perm[i] = ( unsigned char ) ( random() / ( float ) RAND_MAX * 255 ); } } diff --git a/code/server/sv_client.c b/code/server/sv_client.c index e208a5b..6c3e2e0 100644 --- a/code/server/sv_client.c +++ b/code/server/sv_client.c @@ -73,7 +73,7 @@ void SV_GetChallenge( netadr_t from ) { // this is the first time this client has asked for a challenge challenge = &svs.challenges[oldest]; - challenge->challenge = ( (rand() << 16) ^ rand() ) ^ svs.time; + challenge->challenge = ( (random() << 16) ^ random() ) ^ svs.time; challenge->adr = from; challenge->firstTime = svs.time; challenge->time = svs.time; diff --git a/code/server/sv_init.c b/code/server/sv_init.c index 874aeaf..47c9810 100644 --- a/code/server/sv_init.c +++ b/code/server/sv_init.c @@ -475,8 +475,7 @@ void SV_SpawnServer( char *server, qboolean killBots ) { Cvar_Set("cl_paused", "0"); // get a new checksum feed and restart the file system - srand(Com_Milliseconds()); - sv.checksumFeed = ( ((int) rand() << 16) ^ rand() ) ^ Com_Milliseconds(); + sv.checksumFeed = ( ((int) random() << 16) ^ random() ) ^ Com_Milliseconds(); FS_Restart( sv.checksumFeed ); CM_LoadMap( va("maps/%s.bsp", server), qfalse, &checksum ); -- cgit v1.2.3