mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-10-26 12:27:44 +00:00 
			
		
		
		
	Added algorithm comments to SDL_rand_*()
This commit is contained in:
		 John Kaniarz
					John Kaniarz
				
			
				
					committed by
					
						 Sam Lantinga
						Sam Lantinga
					
				
			
			
				
	
			
			
			 Sam Lantinga
						Sam Lantinga
					
				
			
						parent
						
							8f29f8cae5
						
					
				
				
					commit
					38cac043af
				
			| @@ -36,7 +36,7 @@ void SDL_srand(Uint64 seed) | |||||||
|  |  | ||||||
| Uint32 SDL_rand_bits(void) | Uint32 SDL_rand_bits(void) | ||||||
| { | { | ||||||
|     if(!SDL_rand_initialized) { |     if (!SDL_rand_initialized) { | ||||||
|         SDL_srand(0); |         SDL_srand(0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -63,6 +63,10 @@ Uint32 SDL_rand_bits(void) | |||||||
|  |  | ||||||
| Sint32 SDL_rand_n(Sint32 n) | Sint32 SDL_rand_n(Sint32 n) | ||||||
| { | { | ||||||
|  |     // Algorithm: get 32 bits from SDL_rand_bits() and treat it as a 0.32 bit | ||||||
|  |     // fixed point number. Multiply by the 31.0 bit n to get a 31.32 bit | ||||||
|  |     // result. Shift right by 32 to get the 31 bit integer that we want. | ||||||
|  |  | ||||||
|     // On 32-bit arch, the compiler will optimize to a single 32-bit multiply |     // On 32-bit arch, the compiler will optimize to a single 32-bit multiply | ||||||
|     Uint64 val = (Uint64)SDL_rand_bits() * n; |     Uint64 val = (Uint64)SDL_rand_bits() * n; | ||||||
|     return (Sint32)(val >> 32); |     return (Sint32)(val >> 32); | ||||||
| @@ -70,5 +74,6 @@ Sint32 SDL_rand_n(Sint32 n) | |||||||
|  |  | ||||||
| float SDL_rand_float(void) | float SDL_rand_float(void) | ||||||
| { | { | ||||||
| 	return (SDL_rand_bits() >> (32-24)) * 0x1p-24f; |     // Note: its using 24 bits because float has 23 bits significand + 1 implicit bit | ||||||
|  |     return (SDL_rand_bits() >> (32 - 24)) * 0x1p-24f; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -188,15 +188,15 @@ int main(int argc, char *argv[]) | |||||||
|         quit(2); |         quit(2); | ||||||
|     } |     } | ||||||
|     for (i = 0; i < NUM_SPRITES; ++i) { |     for (i = 0; i < NUM_SPRITES; ++i) { | ||||||
|         positions[i].x = (float)(SDL_rand_n((window_w - (int)sprite_w))); |         positions[i].x = (float)(SDL_rand_n(window_w - (int)sprite_w)); | ||||||
|         positions[i].y = (float)(SDL_rand_n((window_h - (int)sprite_h))); |         positions[i].y = (float)(SDL_rand_n(window_h - (int)sprite_h)); | ||||||
|         positions[i].w = sprite_w; |         positions[i].w = sprite_w; | ||||||
|         positions[i].h = sprite_h; |         positions[i].h = sprite_h; | ||||||
|         velocities[i].x = 0.0f; |         velocities[i].x = 0.0f; | ||||||
|         velocities[i].y = 0.0f; |         velocities[i].y = 0.0f; | ||||||
|         while (velocities[i].x == 0.f && velocities[i].y == 0.f) { |         while (velocities[i].x == 0.f && velocities[i].y == 0.f) { | ||||||
|             velocities[i].x = (float)((SDL_rand_n((MAX_SPEED * 2 + 1))) - MAX_SPEED); |             velocities[i].x = (float)(SDL_rand_n(MAX_SPEED * 2 + 1) - MAX_SPEED); | ||||||
|             velocities[i].y = (float)((SDL_rand_n((MAX_SPEED * 2 + 1))) - MAX_SPEED); |             velocities[i].y = (float)(SDL_rand_n(MAX_SPEED * 2 + 1) - MAX_SPEED); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user