#include #include #include "MiscSupport.h" #include "Random.h" static __thread drand48_data *buffer = NULL; static void initBuffer() { if (buffer) return; buffer = new drand48_data; long seedval = TimeVal(true).asMicroseconds() ^ pthread_self(); srand48_r(seedval, buffer); } int32_t getRandom31() { initBuffer(); // A long is 64 bits, but the result is only 31 bits. long int result; lrand48_r(buffer, &result); return result; } uint64_t getRandom64() { initBuffer(); long int a, b, c; lrand48_r(buffer, &a); lrand48_r(buffer, &b); lrand48_r(buffer, &c); return a ^ (b << 33) ^ (c << 16); } double getRandomD() { initBuffer(); double result; drand48_r(buffer, &result); return result; }