#include "prand.h" #include #include #include #include #define PRAND_BUILD_SEED \ ((uint64_t)(__TIME__[0]) * (uint64_t)(__TIME__[1]) * (uint64_t)(__TIME__[3]) * (uint64_t)(__TIME__[4]) * \ (uint64_t)(__TIME__[6]) * (uint64_t)(__TIME__[7])) static uint64_t seed = PRAND_BUILD_SEED * 6364136223846793005ULL + 1; uint64_t prand() { seed = seed * 6364136223846793005ULL + 1; return seed; } inline uint64_t prand_range(uint64_t min, uint64_t max) { uint64_t range = max - min + 1; uint64_t x; uint64_t limit = UINT64_MAX - (UINT64_MAX % range); do { x = prand(); } while (x > limit); return min + (x % range); } void sprand(uint64_t s) { if (s) { seed ^= (s * 0x9e3779b97f4a7c15ULL) + (seed << 6) + (seed >> 2); } else { seed ^= PRAND_BUILD_SEED; } } #undef PRAND_BUILD_SEED #define PRAND_MAIN #ifdef PRAND_MAIN int main() { // time(NULL) provides a somewhat unique seed at runtime sprand(time(NULL)); sprand(getpid()); sprand(0); uint64_t rn1 = prand(); uint64_t rn2 = prand(); printf("rn1 = %lu\n", rn1); printf("rn2 = %lu\n", rn2); for (int i = 0; i < 40; i++) { uint64_t random = prand_range(0, 1000); printf("random = %lu\n", random); } } #endif