#include #include #include #include #include #include #include #include "xoroshiro128_plus.h" int devrandom_getbytes(uint64_t dest[], size_t size) { FILE *fp; int i=0; fp=fopen("/dev/urandom","r"); if (fp==NULL) return 1; while(i < size){ sprintf((void *) dest,"%s%02x",(void *) dest,fgetc(fp)); i++; } fclose(fp) ; // invert the 2nd seed value to avoid similar reads from // urandom. dest[1] = 1 - dest[1] ; return 0 ; } void main() { // Simple test program for the xoroshiro128+ RNG // Define a seed. uint64_t seed[XOROSHIRO128_PLUS_SEED_LENGTH] ; uint64_t jump_seed[XOROSHIRO128_PLUS_SEED_LENGTH] ; // Use /dev/random on Linux to get some random bytes as a starting seed. if (devrandom_getbytes((void*)seed, sizeof(seed)) > 0) { printf("Error using /dev/urandom, using fixed seed.\n") ; seed[0] = 839482348329484L ; seed[1] = 585904385021312L ; } const int NUM = 10 ; // Print out a few 64-bit ints. printf("Some 64-bit ints: \n") ; for (int i = 0 ; i < NUM ; i++) { printf("%lu\n",next(seed)) ; } // And now some doubles. printf("\n Some doubles: \n") ; for (int i = 0 ; i < NUM ; i++) { printf("%f\n",next_double(seed)) ; } // And finally some floats. printf("\n Some floats: \n") ; for (int i = 0 ; i < NUM ; i++) { printf("%f\n",next_float(seed)) ; } // Now jump jump(seed,jump_seed); // And printout a few more ... printf("Seed and jump seed output\n") ; for (int i = 0 ; i < NUM ; i++) { printf("%lu : %lu\n",next(seed),next(jump_seed)) ; } }