diff options
Diffstat (limited to 'src/common/random.c')
-rw-r--r-- | src/common/random.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/common/random.c b/src/common/random.c index ba70a5c1d..dbb2ca830 100644 --- a/src/common/random.c +++ b/src/common/random.c @@ -2,7 +2,7 @@ * This file is part of Hercules. * http://herc.ws - http://github.com/HerculesWS/Hercules * - * Copyright (C) 2012-2015 Hercules Dev Team + * Copyright (C) 2012-2016 Hercules Dev Team * Copyright (C) Athena Dev Teams * * Hercules is free software: you can redistribute it and/or modify @@ -27,6 +27,7 @@ #include "common/timer.h" // gettick #include <mt19937ar/mt19937ar.h> // init_genrand, genrand_int32, genrand_res53 +#include <stdlib.h> #if defined(WIN32) # include "common/winapi.h" @@ -35,6 +36,8 @@ # include <unistd.h> #endif +struct rnd_interface rnd_s; +struct rnd_interface *rnd; /// Initializes the random number generator with an appropriate seed. void rnd_init(void) @@ -53,8 +56,14 @@ void rnd_init(void) #endif // HAVE_GETTID #endif init_genrand(seed); + + // Also initialize the stdlib rng, just in case it's used somewhere. + srand((unsigned int)timer->gettick()); } +void rnd_final(void) +{ +} /// Initializes the random number generator. void rnd_seed(uint32 seed) @@ -64,7 +73,7 @@ void rnd_seed(uint32 seed) /// Generates a random number in the interval [0, SINT32_MAX] -int32 rnd(void) +int32 rnd_random(void) { return (int32)genrand_int31(); } @@ -74,7 +83,7 @@ int32 rnd(void) /// NOTE: interval is open ended, so dice_faces is excluded (unless it's 0) uint32 rnd_roll(uint32 dice_faces) { - return (uint32)(rnd_uniform()*dice_faces); + return (uint32)(rnd->uniform()*dice_faces); } @@ -84,7 +93,7 @@ int32 rnd_value(int32 min, int32 max) { if( min >= max ) return min; - return min + (int32)(rnd_uniform()*(max-min+1)); + return min + (int32)(rnd->uniform()*(max-min+1)); } @@ -103,3 +112,16 @@ double rnd_uniform53(void) { return genrand_res53(); } + +void rnd_defaults(void) +{ + rnd = &rnd_s; + rnd->init = rnd_init; + rnd->final = rnd_final; + rnd->seed = rnd_seed; + rnd->random = rnd_random; + rnd->roll = rnd_roll; + rnd->value = rnd_value; + rnd->uniform = rnd_uniform; + rnd->uniform53 = rnd_uniform53; +} |