summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/lib/math
diff options
context:
space:
mode:
authorJohannes Demel <ufcsy@student.kit.edu>2015-09-28 11:00:27 +0200
committerJohannes Demel <ufcsy@student.kit.edu>2015-09-28 14:48:21 +0200
commita09f44a82ec9c8f8932f815f9b5f90127d1edbe2 (patch)
tree887eec902d265c7da12dc7f5821c91ec231d7368 /gnuradio-runtime/lib/math
parent44ef5e1c240b7d5aeac7ca6537c4b07f3cf606c5 (diff)
random-analog: fixed reseed issue
Diffstat (limited to 'gnuradio-runtime/lib/math')
-rw-r--r--gnuradio-runtime/lib/math/random.cc22
1 files changed, 15 insertions, 7 deletions
diff --git a/gnuradio-runtime/lib/math/random.cc b/gnuradio-runtime/lib/math/random.cc
index b35dfa106e..5e16c96ea4 100644
--- a/gnuradio-runtime/lib/math/random.cc
+++ b/gnuradio-runtime/lib/math/random.cc
@@ -48,13 +48,14 @@ namespace gr {
{
d_gauss_stored = false; // set gasdev (gauss distributed numbers) on calculation state
- // Setup random number generator
- d_rng = new boost::mt19937;
+ // Setup random number generators
+ d_rng = new boost::mt19937; // random numbers are generated here.
+ d_uniform = new boost::uniform_real<float>; // map random number to distribution
+ d_integer_dis = new boost::random::uniform_int_distribution<>(0, 1); // another "mapper"
+ d_generator = NULL; // MUST be reinstantiated on every call to reseed.
+ d_integer_generator = NULL; // MUST be reinstantiated on everytime d_rng or d_integer_dis is changed.
reseed(seed); // set seed for random number generator
- d_uniform = new boost::uniform_real<float>;
- d_integer_dis = new boost::random::uniform_int_distribution<>(min_integer, max_integer - 1);
- d_generator = new boost::variate_generator<boost::mt19937&, boost::uniform_real<float> > (*d_rng,*d_uniform); // create number generator in [0,1) from boost.random
- d_integer_generator = new boost::variate_generator<boost::mt19937&, boost::random::uniform_int_distribution<> >(*d_rng, *d_integer_dis);
+ set_integer_limits(min_integer, max_integer);
}
random::~random()
@@ -72,10 +73,14 @@ namespace gr {
void
random::reseed(unsigned int seed)
{
- //FIXME: method without effect after c'tor.
if(seed==0) d_seed = static_cast<unsigned int>(std::time(0));
else d_seed = seed;
d_rng->seed(d_seed);
+ // reinstantiate generators. Otherwise reseed doesn't take effect.
+ delete d_generator;
+ d_generator = new boost::variate_generator<boost::mt19937&, boost::uniform_real<float> > (*d_rng,*d_uniform); // create number generator in [0,1) from boost.random
+ delete d_integer_generator;
+ d_integer_generator = new boost::variate_generator<boost::mt19937&, boost::random::uniform_int_distribution<> >(*d_rng, *d_integer_dis);
}
void
@@ -87,6 +92,9 @@ namespace gr {
d_integer_generator = new boost::variate_generator<boost::mt19937&, boost::random::uniform_int_distribution<> >(*d_rng, *d_integer_dis);
}
+ /*!
+ * Uniform random integers in the range set by 'set_integer_limits' [min, max).
+ */
int
random::ran_int(){
return (*d_integer_generator)();