summaryrefslogtreecommitdiff
path: root/src/common/random.c
diff options
context:
space:
mode:
authorhemagx <hemagx2@gmail.com>2016-02-17 21:43:45 +0200
committerHaru <haru@dotalux.com>2016-07-12 20:58:39 +0200
commit527cf1b812a117285957be820ba1dc31533e9073 (patch)
treef06aac6f2c19f3b2f6498a2f368ffb5c7aee99dc /src/common/random.c
parent2af9259a48ef9d7ec864fa80d1cb0392f2f2ee7a (diff)
downloadhercules-527cf1b812a117285957be820ba1dc31533e9073.tar.gz
hercules-527cf1b812a117285957be820ba1dc31533e9073.tar.bz2
hercules-527cf1b812a117285957be820ba1dc31533e9073.tar.xz
hercules-527cf1b812a117285957be820ba1dc31533e9073.zip
Interface random.c
Diffstat (limited to 'src/common/random.c')
-rw-r--r--src/common/random.c30
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;
+}