A base class for random generators. More...
#include <RandomLib/RandomSeed.hpp>
Public Types | |
typedef Random_u32 | u32 |
typedef Random_u64 | u64 |
typedef RandomType < 32, unsigned long > | seed_t |
typedef seed_t::type | seed_type |
Public Member Functions | |
virtual | ~RandomSeed ()=0 throw () |
Resetting the seed | |
template<typename IntType > | |
void | Reseed (const std::vector< IntType > &v) throw (std::bad_alloc) |
template<typename InputIterator > | |
void | Reseed (InputIterator a, InputIterator b) throw (std::bad_alloc) |
void | Reseed (seed_type n) throw (std::bad_alloc) |
void | Reseed () throw (std::bad_alloc) |
void | Reseed (const std::string &s) throw (std::bad_alloc) |
Examining the seed | |
const std::vector< seed_type > & | Seed () const throw () |
std::string | SeedString () const throw (std::bad_alloc) |
Resetting the random seed | |
virtual void | Reset ()=0 throw () |
Static Public Member Functions | |
Static functions for seed management | |
static seed_type | SeedWord () |
static std::vector< seed_type > | SeedVector () |
template<typename IntType > | |
static std::string | VectorToString (const std::vector< IntType > &v) throw (std::ios::failure) |
static std::vector< seed_type > | StringToVector (const std::string &s) throw (std::bad_alloc) |
Protected Attributes | |
std::vector< seed_type > | _seed |
A base class for random generators.
This provides facilities for managing the seed and for converting the seed into random generator state.
The seed is taken to be a vector of unsigned longs of arbitrary length. (Only the low 32 bit of each element of the vector are used.) The class provides several methods for setting the seed, static functions for producing "random" and "unique" seeds, and facilities for converting the seed to a string so that it can be printed easily.
The seeding algorithms are those used by MT19937 with some modifications to make all states accessible and to minimize the likelihood of different seeds giving the same state.
Finally some low-level routines are provided to facilitate the creation of I/O methods for the random generator.
A random generator class can be written based on this class. The generator class would use the base class methods for setting the seed and for converting the seed into state. It would provide the machinery for advancing the state and for producing random data. It is also responsible for the routine to save and restore the generator state (including the seed).
Written by Charles Karney <charles@karney.com> and licensed under the LGPL. The seeding algorithms are adapted from those of MT19937. For more information, see http://charles.karney.info/random/
Definition at line 56 of file RandomSeed.hpp.
typedef Random_u32 RandomLib::RandomSeed::u32 |
Definition at line 58 of file RandomSeed.hpp.
typedef Random_u64 RandomLib::RandomSeed::u64 |
Definition at line 59 of file RandomSeed.hpp.
typedef RandomType<32, unsigned long> RandomLib::RandomSeed::seed_t |
A type large enough to hold the seed words. This is needs to hold 32 bits and is an unsigned long for portability.
Definition at line 66 of file RandomSeed.hpp.
Definition at line 67 of file RandomSeed.hpp.
RandomLib::RandomSeed::~RandomSeed | ( | ) | throw () [inline, pure virtual] |
Definition at line 206 of file RandomSeed.hpp.
void RandomLib::RandomSeed::Reseed | ( | const std::vector< IntType > & | v | ) | throw (std::bad_alloc) [inline] |
Set the seed to a vector v. Only the low 32 bits of each element are used.
Definition at line 76 of file RandomSeed.hpp.
References Reseed().
Referenced by RandomLib::RandomEngine< Algorithm, Mixer >::SelfTest().
void RandomLib::RandomSeed::Reseed | ( | InputIterator | a, | |
InputIterator | b | |||
) | throw (std::bad_alloc) [inline] |
Set the seed to [a, b) from a pair of iterators. The iterator must produce results which can be converted into seed_type. Only the low 32 bits of each element are used.
Definition at line 86 of file RandomSeed.hpp.
References _seed, RandomLib::RandomType< bits, UIntType >::cast(), and Reset().
void RandomLib::RandomSeed::Reseed | ( | seed_type | n | ) | throw (std::bad_alloc) [inline] |
Set the seed to [n]. Only the low 32 bits of n are used.
Definition at line 98 of file RandomSeed.hpp.
References _seed, RandomLib::RandomType< bits, UIntType >::cast(), and Reset().
void RandomLib::RandomSeed::Reseed | ( | ) | throw (std::bad_alloc) [inline] |
Set the seed to [SeedVector()]
Definition at line 108 of file RandomSeed.hpp.
References Reseed(), and SeedVector().
Referenced by RandomLib::RandomEngine< Algorithm, Mixer >::RandomEngine(), and Reseed().
void RandomLib::RandomSeed::Reseed | ( | const std::string & | s | ) | throw (std::bad_alloc) [inline] |
Set the seed from the string s using Random::StringToVector
Definition at line 112 of file RandomSeed.hpp.
References _seed, Reset(), and StringToVector().
const std::vector<seed_type>& RandomLib::RandomSeed::Seed | ( | ) | const throw () [inline] |
Return reference to the seed vector (read-only)
Definition at line 126 of file RandomSeed.hpp.
References _seed.
std::string RandomLib::RandomSeed::SeedString | ( | ) | const throw (std::bad_alloc) [inline] |
Format the current seed suitable for printing.
Definition at line 130 of file RandomSeed.hpp.
References _seed, and VectorToString().
Referenced by RandomLib::RandomEngine< Algorithm, Mixer >::SelfTest().
virtual void RandomLib::RandomSeed::Reset | ( | ) | throw () [pure virtual] |
Resets the sequence to its just-seeded state. This needs to be declared vitual here so that the Reseed functions can call it after saving the seed.
Implemented in RandomLib::RandomEngine< Algorithm, Mixer >.
Referenced by Reseed().
RandomSeed::seed_type RandomLib::RandomSeed::SeedWord | ( | ) | [static] |
Return a 32 bits of data suitable for seeding the random generator. The result is obtained by combining data from /dev/urandom, gettimeofday, time, and getpid to provide a reasonably "random" word of data.
Definition at line 158 of file Random.cpp.
References RandomLib::RandomType< bits, UIntType >::cast(), RandomLib::RandomType< bits, UIntType >::CheckSum(), SeedVector(), and STATIC_ASSERT.
std::vector< RandomSeed::seed_type > RandomLib::RandomSeed::SeedVector | ( | ) | [static] |
Return a vector of unsigned longs suitable for seeding the random generator. The vector is almost certainly unique; however, the results of successive calls to Random::SeedVector() will be correlated. If several Random objects are required within a single program execution, call Random::SeedVector once, print it out (!), push_back additional data to identify the instance (e.g., loop index, thread ID, etc.), and use the result to seed the Random object.
Definition at line 181 of file Random.cpp.
References RandomLib::RandomType< bits, UIntType >::cast().
Referenced by Reseed(), and SeedWord().
static std::string RandomLib::RandomSeed::VectorToString | ( | const std::vector< IntType > & | v | ) | throw (std::ios::failure) [inline, static] |
Convert a vector into a string suitable for printing or as an argument for Random::Reseed(const std::string& s).
Definition at line 169 of file RandomSeed.hpp.
References RandomLib::RandomType< bits, UIntType >::cast().
Referenced by SeedString().
std::vector< RandomSeed::seed_type > RandomLib::RandomSeed::StringToVector | ( | const std::string & | s | ) | throw (std::bad_alloc) [static] |
Convert a string into a vector of seed_type suitable for printing or as an argument for Random::Reseed(const std::vector<seed_type>& v). Reads consecutive digits in string. Thus "[1,2,3]" => [1,2,3]; "-0.123e-4" => [0,123,4], etc. strtoul understands C's notation for octal and hexadecimal, for example "012 10 0xa" => [10,10,10]. Reading of a number stops at the first illegal character for the base. Thus "2006-04-08" => [2006,4,0,8] (i.e., 08 becomes two numbers). Note that input numbers greater than ULONG_MAX overflow to ULONG_MAX, which probably will result in the number being interpreted as LONG_MASK.
Definition at line 217 of file Random.cpp.
Referenced by Reseed().
std::vector<seed_type> RandomLib::RandomSeed::_seed [protected] |
The seed vector
Definition at line 202 of file RandomSeed.hpp.
Referenced by RandomLib::RandomEngine< Algorithm, Mixer >::Init(), RandomLib::RandomEngine< Algorithm, Mixer >::Load(), RandomLib::RandomEngine< Algorithm, Mixer >::operator==(), Reseed(), Seed(), and SeedString().