grandom.cc 1.14 KB
Newer Older
1 2 3
/*
 * grandom.cc
 *
Albert Astals Cid's avatar
Albert Astals Cid committed
4 5
 * This file is licensed under the GPLv2 or later
 *
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 * Pseudo-random number generation
 *
 * Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
 */

#include <config.h>
#include "grandom.h"
#include "gtypes.h"

#ifdef HAVE_RAND_R // rand_r backend (POSIX)

static GBool initialized = gFalse;

#include <stdlib.h>
#include <time.h>
static unsigned int seed;

static void initialize() {
  if (!initialized) {
25
    seed = time(nullptr);
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
    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 <stdlib.h>
#include <time.h>

static void initialize() {
  if (!initialized) {
52
    srand(time(nullptr));
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
    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