Create single state struct and add utility function for initialising it
This commit is contained in:
		
							
								
								
									
										39
									
								
								xorshift.c
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								xorshift.c
									
									
									
									
									
								
							| @@ -9,14 +9,7 @@ typedef struct { | |||||||
| 	u64 y; | 	u64 y; | ||||||
| 	u64 z; | 	u64 z; | ||||||
| 	u64 w; | 	u64 w; | ||||||
| } XORShift256; | } XOR256State; | ||||||
|  |  | ||||||
| typedef struct { |  | ||||||
|   u64 x; |  | ||||||
|   u64 y; |  | ||||||
|   u64 z; |  | ||||||
|   u64 w; |  | ||||||
| } XOShiRo256SS; |  | ||||||
|  |  | ||||||
| typedef u64(RandGenFunc)(void *s); | typedef u64(RandGenFunc)(void *s); | ||||||
|  |  | ||||||
| @@ -25,6 +18,7 @@ u64 xorshift_256_generate(void *s); | |||||||
| void test_xoshiro_256ss(Image *img); | void test_xoshiro_256ss(Image *img); | ||||||
| u64 xoshiro_256ss_generate(void *s); | u64 xoshiro_256ss_generate(void *s); | ||||||
| u64 rol64(u64 x, u64 bits); | u64 rol64(u64 x, u64 bits); | ||||||
|  | XOR256State init_xor_256_state(); | ||||||
| void write_image_data(Image *img, RandGenFunc *gen_rand, void *s); | void write_image_data(Image *img, RandGenFunc *gen_rand, void *s); | ||||||
|  |  | ||||||
| int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||||||
| @@ -54,18 +48,12 @@ int main(int argc, char *argv[]) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void test_xorshift_256(Image *img) { | void test_xorshift_256(Image *img) { | ||||||
|   XORShift256 state = { |   XOR256State state = init_xor_256_state(); | ||||||
|       .x = lrand48(), |  | ||||||
|       .y = lrand48(), |  | ||||||
|       .z = lrand48(), |  | ||||||
|       .w = lrand48(), |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   write_image_data(img, xorshift_256_generate, (void *)&state); |   write_image_data(img, xorshift_256_generate, (void *)&state); | ||||||
| } | } | ||||||
|  |  | ||||||
| u64 xorshift_256_generate(void *s) { | u64 xorshift_256_generate(void *s) { | ||||||
|   XORShift256 *state = (XORShift256 *)s; |   XOR256State *state = (XOR256State *)s; | ||||||
|  |  | ||||||
|   u64 t = state->x ^ (state->x << 11); |   u64 t = state->x ^ (state->x << 11); | ||||||
|  |  | ||||||
| @@ -78,18 +66,12 @@ u64 xorshift_256_generate(void *s) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void test_xoshiro_256ss(Image *img) { | void test_xoshiro_256ss(Image *img) { | ||||||
|   XOShiRo256SS state = { |   XOR256State state = init_xor_256_state(); | ||||||
|       .x = lrand48(), |  | ||||||
|       .y = lrand48(), |  | ||||||
|       .z = lrand48(), |  | ||||||
|       .w = lrand48(), |  | ||||||
|   }; |  | ||||||
|  |  | ||||||
|   write_image_data(img, xoshiro_256ss_generate, (void *)&state); |   write_image_data(img, xoshiro_256ss_generate, (void *)&state); | ||||||
| } | } | ||||||
|  |  | ||||||
| u64 xoshiro_256ss_generate(void *s) { | u64 xoshiro_256ss_generate(void *s) { | ||||||
|   XOShiRo256SS *state = (XOShiRo256SS *)s; |   XOR256State *state = (XOR256State *)s; | ||||||
|  |  | ||||||
|   const u64 result = rol64(state->z * 5, 7) * 9; |   const u64 result = rol64(state->z * 5, 7) * 9; | ||||||
|   const u64 t = state->z << 17; |   const u64 t = state->z << 17; | ||||||
| @@ -107,6 +89,15 @@ u64 xoshiro_256ss_generate(void *s) { | |||||||
|  |  | ||||||
| u64 rol64(u64 x, u64 bits) { return (x << bits) | (x >> (64 - bits)); } | u64 rol64(u64 x, u64 bits) { return (x << bits) | (x >> (64 - bits)); } | ||||||
|  |  | ||||||
|  | XOR256State init_xor_256_state() { | ||||||
|  | 	return (XOR256State){ | ||||||
|  |       .x = lrand48(), | ||||||
|  |       .y = lrand48(), | ||||||
|  |       .z = lrand48(), | ||||||
|  |       .w = lrand48(), | ||||||
|  | 	}; | ||||||
|  | } | ||||||
|  |  | ||||||
| void write_image_data(Image *img, RandGenFunc *gen_rand, void *s) { | void write_image_data(Image *img, RandGenFunc *gen_rand, void *s) { | ||||||
|   for (u64 y = 0; y < img->height; ++y) { |   for (u64 y = 0; y < img->height; ++y) { | ||||||
|     for (u64 x = 0; x < img->width; ++x) { |     for (u64 x = 0; x < img->width; ++x) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user