diff options
| author | thilo <thilo@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2009-05-31 19:48:28 +0000 | 
|---|---|---|
| committer | thilo <thilo@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2009-05-31 19:48:28 +0000 | 
| commit | e3fc31a512c6636777ab81a31eff789f2d4c64ff (patch) | |
| tree | d13f686d79db091c7bbf5c5cc8a706a3d92ec70c | |
| parent | 25f4f42f9bfa511cc7e170a379855f5c2419a8d2 (diff) | |
| download | ioquake3-aero-e3fc31a512c6636777ab81a31eff789f2d4c64ff.tar.gz ioquake3-aero-e3fc31a512c6636777ab81a31eff789f2d4c64ff.zip  | |
- 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
| -rw-r--r-- | code/client/cl_main.c | 8 | ||||
| -rw-r--r-- | code/qcommon/common.c | 26 | ||||
| -rw-r--r-- | code/renderer/tr_noise.c | 6 | ||||
| -rw-r--r-- | code/server/sv_client.c | 2 | ||||
| -rw-r--r-- | 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 @@ -2502,6 +2502,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 );  | 
