A base class for random generators. More...
#include <RandomLib-2010-01/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://randomlib.sourceforge.net/
typedef Random_u32 RandomLib::RandomSeed::u32 |
Definition at line 57 of file RandomSeed.hpp.
typedef Random_u64 RandomLib::RandomSeed::u64 |
Definition at line 58 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 65 of file RandomSeed.hpp.
Definition at line 66 of file RandomSeed.hpp.
RandomLib::RandomSeed::~RandomSeed | ( | ) | throw () [inline, pure virtual] |
Definition at line 205 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 75 of file RandomSeed.hpp.
References Reseed().
Referenced by RandomLib::RandomEngine::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 85 of file RandomSeed.hpp.
References RandomLib::RandomType::cast(), _seed, 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 97 of file RandomSeed.hpp.
References _seed, RandomLib::RandomType::cast(), and Reset().
void RandomLib::RandomSeed::Reseed | ( | ) | throw (std::bad_alloc) [inline] |
Set the seed to [SeedVector()]
Definition at line 107 of file RandomSeed.hpp.
References Reseed(), and SeedVector().
Referenced by RandomLib::RandomEngine::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 111 of file RandomSeed.hpp.
References StringToVector(), _seed, and Reset().
const std::vector<seed_type>& RandomLib::RandomSeed::Seed | ( | ) | const throw () [inline] |
Return reference to the seed vector (read-only)
Definition at line 125 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 129 of file RandomSeed.hpp.
References VectorToString(), and _seed.
Referenced by RandomLib::RandomEngine::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.
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 157 of file Random.cpp.
References 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 180 of file Random.cpp.
Referenced by Reseed().
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 168 of file RandomSeed.hpp.
References RandomLib::RandomType::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 216 of file Random.cpp.
Referenced by Reseed().
std::vector<seed_type> RandomLib::RandomSeed::_seed [protected] |
The seed vector
Definition at line 201 of file RandomSeed.hpp.
Referenced by RandomLib::RandomEngine::operator==(), RandomLib::RandomEngine::Load(), Reseed(), Seed(), and SeedString().