use mt19937 also in default random generator

previously rng::next_random_impl() returned rand() which is in range
1-2^16. so random_new::generator->next_random() would return a number
1-2^16 in unsynced context and a number in 1-2^32 in synced contexts.
Now it always returns a number in 1-2^32.
This commit is contained in:
gfgtdf 2015-08-04 20:24:41 +02:00
parent 5aab187ee6
commit f5c64af8de
4 changed files with 33 additions and 17 deletions

View file

@ -18,6 +18,8 @@
#include <cassert>
#include <stdlib.h>
#include <boost/random/mersenne_twister.hpp>
#include <time.h>
static lg::log_domain log_random("random");
#define DBG_RND LOG_STREAM(debug, log_random)
@ -25,9 +27,29 @@ static lg::log_domain log_random("random");
#define WRN_RND LOG_STREAM(warn, log_random)
#define ERR_RND LOG_STREAM(err, log_random)
namespace {
class rng_default : public random_new::rng
{
public:
rng_default()
: gen_(time(NULL))
{
}
protected:
virtual uint32_t next_random_impl()
{
return gen_();
}
private:
boost::mt19937 gen_;
};
}
namespace random_new
{
rng* generator = new rng();
rng* generator = &rng::default_instance();
rng::rng()
: random_calls_(0)
@ -40,6 +62,12 @@ namespace random_new
}
rng& rng::default_instance()
{
static rng* def = new rng_default();
return *def;
}
unsigned int rng::get_random_calls()
{
return random_calls_;
@ -71,13 +99,4 @@ namespace random_new
assert(max >= 0);
return static_cast<int> (next_random() % (static_cast<uint32_t>(max)+1));
}
uint32_t rng::next_random_impl()
{
//getting here means random was called form outsiude a synced context.
uint32_t retv = rand();
LOG_RND << "random_new::rng::next_random returned " << retv;
return retv;
}
}

View file

@ -49,9 +49,9 @@ namespace random_new
*/
int get_random_int(int min, int max)
{ return min + get_random_int_in_range_zero_to(max - min); }
static rng& default_instance();
protected:
virtual uint32_t next_random_impl();
virtual uint32_t next_random_impl() = 0;
unsigned int random_calls_;
private:
@ -68,6 +68,5 @@ namespace random_new
Outside a synced context this has the same effect as rand()
*/
extern rng* generator;
}
#endif

View file

@ -503,15 +503,14 @@ int set_scontext_synced::get_random_calls()
leave_synced_context::leave_synced_context()
: new_rng_()
, old_rng_(random_new::generator)
: old_rng_(random_new::generator)
{
assert(synced_context::get_synced_state() == synced_context::SYNCED);
synced_context::set_synced_state(synced_context::LOCAL_CHOICE);
//calling the synced rng form inside a local_choice would cause oos.
//TODO: should we also reset the synced checkup?
random_new::generator = &new_rng_;
random_new::generator = &random_new::rng::default_instance();
}
leave_synced_context::~leave_synced_context()

View file

@ -206,7 +206,6 @@ public:
leave_synced_context();
~leave_synced_context();
private:
random_new::rng new_rng_;
random_new::rng* old_rng_;
};