38 lines · 1.0 KB · C
RawDownload
/* -*- mode: C; mode: folding; fill-column: 70; -*- *//* Copyright 2010,  Georgia Institute of Technology, USA. *//* See COPYING for license. */#include "compat.h"#include <stddef.h>#include <stdlib.h>#include <errno.h> #include "generator/splittable_mrg.h" uint_fast32_t prng_seed[5];static mrg_state prng_state_store;void *prng_state = &prng_state_store; /* Spread the two 64-bit numbers into five nonzero values in the correct * range. */static void make_mrg_seed(uint64_t userseed, uint_fast32_t* seed) {  seed[0] = (userseed & 0x3FFFFFFF) + 1;  seed[1] = ((userseed >> 30) & 0x3FFFFFFF) + 1;  seed[2] = (userseed & 0x3FFFFFFF) + 1;  seed[3] = ((userseed >> 30) & 0x3FFFFFFF) + 1;  seed[4] = ((userseed >> 60) << 4) + (userseed >> 60) + 1;} voidinit_random (void){  long seed = -1;  if (getenv ("SEED")) {    errno = 0;    seed = strtol (getenv ("SEED"), NULL, 10);    if (errno) seed = -1;  }   if (seed < 0) seed = 0xDECAFBAD;  make_mrg_seed (seed, prng_seed);  mrg_seed(&prng_state_store, prng_seed);}