/* * grandom.cc * * This file is licensed under the GPLv2 or later * * Pseudo-random number generation * * Copyright (C) 2012 Fabio D'Urso */ #include #include "grandom.h" #include "gtypes.h" #ifdef HAVE_RAND_R // rand_r backend (POSIX) static GBool initialized = gFalse; #include #include static unsigned int seed; static void initialize() { if (!initialized) { seed = time(nullptr); initialized = gTrue; } } void grandom_fill(Guchar *buff, int size) { initialize(); while (size--) *buff++ = rand_r(&seed) % 256; } double grandom_double() { initialize(); return rand_r(&seed) / (1 + (double)RAND_MAX); } #else // srand+rand backend (unsafe, because it may interfere with the application) static GBool initialized = gFalse; #include #include static void initialize() { if (!initialized) { srand(time(nullptr)); initialized = gTrue; } } void grandom_fill(Guchar *buff, int size) { initialize(); while (size--) *buff++ = rand() % 256; } double grandom_double() { initialize(); return rand() / (1 + (double)RAND_MAX); } #endif