aboutsummaryrefslogtreecommitdiff
path: root/src/rnd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rnd.c')
-rw-r--r--src/rnd.c121
1 files changed, 0 insertions, 121 deletions
diff --git a/src/rnd.c b/src/rnd.c
deleted file mode 100644
index 09aedf7..0000000
--- a/src/rnd.c
+++ /dev/null
@@ -1,121 +0,0 @@
-#include "rnd.h"
-#include "util_rt.h"
-
-#include <stdlib.h>
-#include <time.h>
-
-#include <unistd.h>
-#include <sys/random.h>
-
-#define N ((size_t)624)
-
-
-struct prne_rnd_engine {
- size_t mti;
- uint32_t mt[N];
-};
-
-
-void prne_init_alloc_rnd_engine_result (prne_rnd_engnie_alloc_result_t *r) {
- r->engine = NULL;
- r->result = PRNE_RND_ENGINE_ALLOC_OK;
-}
-
-prne_rnd_engnie_alloc_result_t prne_alloc_rnd_engine (const uint32_t *s) {
- prne_rnd_engnie_alloc_result_t ret;
- uint32_t seed;
-
- prne_init_alloc_rnd_engine_result(&ret);
-
- if (s == NULL) {
- seed = 4357;
- }
- else {
- if (*s == 0) {
- ret.result = PRNE_RND_ENGINE_ALLOC_INVALID_SEED;
- return ret;
- }
- seed = *s;
- }
-
- ret.engine = (prne_rnd_engine_t*)prne_malloc(sizeof(prne_rnd_engine_t), 1);
- if (ret.engine == NULL) {
- ret.result = PRNE_RND_ENGINE_ALLOC_MEM_ERR;
- return ret;
- }
-
- ret.engine->mt[0] = seed;
- for (ret.engine->mti = 1; ret.engine->mti < N; ret.engine->mti += 1) {
- ret.engine->mt[ret.engine->mti] = 69069 * ret.engine->mt[ret.engine->mti - 1];
- }
-
- return ret;
-}
-
-void prne_free_rnd_engine (prne_rnd_engine_t *engine) {
- prne_free(engine);
-}
-
-uint32_t prne_rnd_gen_int (prne_rnd_engine_t *engine) {
- static const size_t M = 397;
- static const uint32_t
- UPPER_MASK = 0x80000000,
- LOWER_MASK = 0x7fffffff,
- TEMPERING_MASK_B = 0x9d2c5680,
- TEMPERING_MASK_C = 0xefc60000;
- static const uint32_t mag01[2] = {0, 0x9908b0df};
- uint32_t y;
-
- if (engine->mti >= N) {
- size_t kk;
-
- for (kk = 0; kk < N - M; kk += 1) {
- y = (engine->mt[kk] & UPPER_MASK) | (engine->mt[kk + 1] & LOWER_MASK);
- engine->mt[kk] = engine->mt[kk + M] ^ (y >> 1) ^ mag01[y & 1];
- }
- for (; kk < N - 1; kk += 1) {
- y = (engine->mt[kk] & UPPER_MASK) | (engine->mt[kk + 1] & LOWER_MASK);
- engine->mt[kk] = engine->mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 1];
- }
- y = (engine->mt[N - 1] & UPPER_MASK) | (engine->mt[0] & LOWER_MASK);
- engine->mt[N - 1] = engine->mt[M - 1] ^ (y >> 1) ^ mag01[y & 1];
-
- engine->mti = 0;
- }
-
- y = engine->mt[engine->mti];
- engine->mti += 1;
- y ^= y >> 11;
- y ^= (y << 7) & TEMPERING_MASK_B;
- y ^= (y << 15) & TEMPERING_MASK_C;
- y ^= y >> 18;
-
- return y;
-}
-
-double prne_rnd_gen_double (prne_rnd_engine_t *engine) {
- return (double)prne_rnd_gen_int(engine) * 2.3283064370807974e-10;
-}
-
-prne_rnd_engine_t *prne_mk_rnd_engine (void) {
- uint32_t seed = 0;
- prne_rnd_engnie_alloc_result_t ret;
-
- getrandom(&seed, sizeof(uint32_t), 0);
-
- if (seed == 0) {
- // fall back to seeding with what's available.
- seed =
- (uint32_t)(time(NULL) % 0xFFFFFFFF) ^
- (uint32_t)(getpid() % 0xFFFFFFFF) ^
- (uint32_t)(getppid() % 0xFFFFFFFF) ^
- (uint32_t)(clock() % 0xFFFFFFFF);
- }
-
- ret = prne_alloc_rnd_engine(seed == 0 ? NULL : &seed);
- if (ret.result != PRNE_RND_ENGINE_ALLOC_OK) {
- return NULL;
- }
-
- return ret.engine;
-}