| [/ |
| / Copyright (c) 2009 Steven Watanabe |
| / |
| / Distributed under the Boost Software License, Version 1.0. (See |
| / accompanying file LICENSE_1_0.txt or copy at |
| / http://www.boost.org/LICENSE_1_0.txt) |
| ] |
| |
| [section Introduction] |
| |
| Random numbers are required in a number of different problem domains, such as |
| |
| * numerics (simulation, Monte-Carlo integration) |
| * games (non-deterministic enemy behavior) |
| * security (key generation) |
| * testing (random coverage in white-box tests) |
| |
| The Boost Random Number Generator Library provides a framework for random |
| number generators with well-defined properties so that the generators can be |
| used in the demanding numerics and security domains. For a general |
| introduction to random numbers in numerics, see |
| |
| [:"Numerical Recipes in C: The art of scientific computing", William H. Press, |
| Saul A. Teukolsky, William A. Vetterling, Brian P. Flannery, 2nd ed., 1992, |
| pp. 274-328] |
| |
| Depending on the requirements of the problem domain, different variations of |
| random number generators are appropriate: |
| |
| * non-deterministic random number generator |
| * pseudo-random number generator |
| * quasi-random number generator |
| |
| All variations have some properties in common, these concepts (in the STL |
| sense) are called __NumberGenerator and __UniformRandomNumberGenerator. Each |
| concept will be defined in a subsequent section. |
| |
| The goals for this library are the following: |
| |
| * allow easy integration of third-party random-number generators |
| * define a validation interface for the generators |
| * provide easy-to-use front-end classes which model popular distributions |
| * provide maximum efficiency |
| * allow control on quantization effects in front-end processing (not yet done) |
| |
| [endsect] |
| |
| [section Number Generator] |
| |
| A number generator is a /function object/ (std:20.3 [lib.function.objects]) that |
| takes zero arguments. Each call to `operator()` returns a number. In the |
| following table, X denotes a number generator class returning objects of type |
| T, and u is a value of X. |
| |
| [table NumberGenerator requirements |
| [[expression] [return type] [pre/post-condition]] |
| [[`X::result_type`] [`T`] [`std::numeric_limits<T>::is_specialized` is |
| `true`, `T` is __LessThanComparable]] |
| [[`u.operator()()`] [`T`] [-]] |
| ] |
| |
| [note The NumberGenerator requirements do not impose any restrictions on the |
| characteristics of the returned numbers.] |
| |
| [endsect] |
| |
| [section Uniform Random Number Generator] |
| |
| A uniform random number generator is a __NumberGenerator that provides a |
| sequence of random numbers uniformly distributed on a given range. The |
| range can be compile-time fixed or available (only) after run-time construction |
| of the object. |
| |
| The /tight lower bound/ of some (finite) set S is the (unique) member l in S, so |
| that for all v in S, l <= v holds. Likewise, the /tight upper bound/ of some |
| (finite) set S is the (unique) member u in S, so that for all v in S, v <= u |
| holds. |
| |
| In the following table, X denotes a number generator class returning objects |
| of type T, and v is a const value of X. |
| |
| [table UniformRandomNumberGenerator requirements |
| [[expression] [return type] [pre/post-condition]] |
| [[`X::has_fixed_range`] [`bool`] [compile-time constant; if `true`, the range |
| on which the random numbers are uniformly |
| distributed is known at compile-time and |
| members `min_value` and `max_value` exist. |
| Note: This flag may also be `false` due to |
| compiler limitations]] |
| [[`X::min_value`] [`T`] [compile-time constant; `min_value` is only defined if |
| `has_fixed_range` is `true`. If it exists, it is |
| equal to `v.min()`.]] |
| [[`X::max_value`] [`T`] [compile-time constant; `max_value` is only defined if |
| `has_fixed_range` is `true`. If it exists, it is |
| equal to `v.max()`]] |
| [[`v.min()`] [`T`] [tight lower bound on the set of all values returned by |
| `operator()`. The return value of this function shall not |
| change during the lifetime of the object.]] |
| [[`v.max()`] [`T`] [if `std::numeric_limits<T>::is_integer`, tight upper |
| bound on the set of all values returned by `operator()`, |
| otherwise, the smallest representable number larger than |
| the tight upper bound on the set of all values returned |
| by `operator()`. In any case, the return value of this |
| function shall not change during the lifetime of the |
| object.]] |
| ] |
| |
| The member functions `min`, `max`, and `operator()` shall have amortized |
| constant time complexity. |
| |
| [note For integer generators (i.e. integer `T`), the generated values `x` |
| fulfill `min() <= x <= max()`, for non-integer generators (i.e. non-integer |
| `T`), the generated values `x` fulfill `min() <= x < max()`. |
| |
| Rationale: The range description with min and max serves two purposes. First, |
| it allows scaling of the values to some canonical range, such as [0..1). |
| Second, it describes the significant bits of the values, which may be |
| relevant for further processing. |
| |
| The range is a closed interval \[min,max\] for integers, because the underlying |
| type may not be able to represent the half-open interval \[min,max+1). It is |
| a half-open interval \[min, max) for non-integers, because this is much more |
| practical for borderline cases of continuous distributions.] |
| |
| [note The __UniformRandomNumberGenerator concept does not require |
| `operator()(long)` and thus it does not fulfill the `RandomNumberGenerator` |
| (std:25.2.11 \[lib.alg.random.shuffle\]) requirements. Use the |
| __random_number_generator adapter for that. |
| |
| Rationale: `operator()(long)` is not provided, because mapping the output of |
| some generator with integer range to a different integer range is not trivial.] |
| |
| [endsect] |
| |
| [section Non-deterministic Uniform Random Number Generator] |
| |
| A non-deterministic uniform random number generator is a |
| __UniformRandomNumberGenerator that is based on some stochastic process. |
| Thus, it provides a sequence of truly-random numbers. Examples for such |
| processes are nuclear decay, noise of a Zehner diode, tunneling of quantum |
| particles, rolling a die, drawing from an urn, and tossing a coin. Depending |
| on the environment, inter-arrival times of network packets or keyboard events |
| may be close approximations of stochastic processes. |
| |
| The class __random_device is a model for a non-deterministic random number |
| generator. |
| |
| [note This type of random-number generator is useful for security |
| applications, where it is important to prevent an outside attacker from |
| guessing the numbers and thus obtaining your encryption or authentication key. |
| Thus, models of this concept should be cautious not to leak any information, |
| to the extent possible by the environment. For example, it might be advisable |
| to explicitly clear any temporary storage as soon as it is no longer needed.] |
| |
| [endsect] |
| |
| [section Pseudo-Random Number Generator] |
| |
| A pseudo-random number generator is a __UniformRandomNumberGenerator which |
| provides a deterministic sequence of pseudo-random numbers, based on some |
| algorithm and internal state. [classref boost::random::linear_congruential |
| Linear congruential] and [classref boost::random::inversive_congruential |
| inversive congruential] generators are examples of such [prng pseudo-random |
| number generators]. Often, these generators are very sensitive to their |
| parameters. In order to prevent wrong implementations from being used, an |
| external testsuite should check that the generated sequence and the validation |
| value provided do indeed match. |
| |
| Donald E. Knuth gives an extensive overview on pseudo-random number generation |
| in his book "The Art of Computer Programming, Vol. 2, 3rd edition, |
| Addison-Wesley, 1997". The descriptions for the specific generators contain |
| additional references. |
| |
| [note Because the state of a pseudo-random number generator is necessarily |
| finite, the sequence of numbers returned by the generator will loop |
| eventually.] |
| |
| In addition to the __UniformRandomNumberGenerator requirements, |
| a pseudo-random number generator has some additional requirements. In the |
| following table, `X` denotes a pseudo-random number generator class returning |
| objects of type `T`, `x` is a value of `T`, `u` is a value of `X`, and `v` is |
| a const value of `X`. |
| |
| [table PseudoRandomNumberGenerator requirements |
| [[expression] [return type] [pre/post-condition]] |
| [[`X()`] [-] [creates a generator in some implementation-defined state. |
| Note: Several generators thusly created may possibly produce |
| dependent or identical sequences of random numbers.]] |
| [[`explicit X(...)`] [-] [creates a generator with user-provided state; the |
| implementation shall specify the constructor |
| argument(s)]] |
| [[`u.seed(...)`] [`void`] [sets the current state according to the |
| argument(s); at least functions with the same |
| signature as the non-default constructor(s) |
| shall be provided.]] |
| [[`X::validation(x)`] [`bool`] [compares the pre-computed and hardcoded |
| 10001th element in the generator's random |
| number sequence with x. The generator must |
| have been constructed by its default |
| constructor and seed must not have been |
| called for the validation to be |
| meaningful.]] |
| ] |
| |
| [note The seed member function is similar to the assign member function in |
| STL containers. However, the naming did not seem appropriate.] |
| |
| Classes which model a pseudo-random number generator shall also model |
| __EqualityComparable, i.e. implement `operator==`. Two pseudo-random number |
| generators are defined to be /equivalent/ if they both return an identical |
| sequence of numbers starting from a given state. |
| |
| Classes which model a pseudo-random number generator should also model the |
| __Streamable concept, i.e. implement `operator<<` and `operator>>`. If so, |
| `operator<<` writes all current state of the pseudo-random number generator |
| to the given `ostream` so that `operator>>` can restore the state at a later |
| time. The state shall be written in a platform-independent manner, but it is |
| assumed that the `locales` used for writing and reading be the same. The |
| pseudo-random number generator with the restored state and the original at |
| the just-written state shall be equivalent. |
| |
| Classes which model a pseudo-random number generator may also model the |
| __CopyConstructible and __Assignable concepts. However, note that the |
| sequences of the original and the copy are strongly correlated (in fact, |
| they are identical), which may make them unsuitable for some problem domains. |
| Thus, copying pseudo-random number generators is discouraged; they should |
| always be passed by (non-const) reference. |
| |
| The classes __rand48, __minstd_rand, and __mt19937 are models for a |
| pseudo-random number generator. |
| |
| [note This type of random-number generator is useful for numerics, games and |
| testing. The non-zero arguments constructor(s) and the `seed()` member |
| function(s) allow for a user-provided state to be installed in the generator. |
| This is useful for debugging Monte-Carlo algorithms and analyzing particular |
| test scenarios. The __Streamable concept allows to save/restore the state of |
| the generator, for example to re-run a test suite at a later time.] |
| |
| [endsect] |
| |
| [section Random Distribution] |
| |
| A random distribution produces random numbers distributed according to some |
| distribution, given uniformly distributed random values as input. In the |
| following table, `X` denotes a random distribution class returning objects of |
| type `T`, `u` is a value of `X`, `x` is a (possibly const) value of `X`, and |
| `e` is an lvalue of an arbitrary type that meets the requirements of a |
| __UniformRandomNumberGenerator, returning values of type `U`. |
| |
| [table Random distribution requirements (in addition to NumberGenerator, CopyConstructible, and Assignable) |
| [[expression] [return type] [pre/post-condition] [complexity]] |
| [[`X::input_type`] [`U`] [-] [compile-time]] |
| [[`u.reset()`] [`void`] [subsequent uses of `u` do not depend on values |
| produced by `e` prior to invoking `reset`.] |
| [constant]] |
| [[`u(e)`] [`T`] [the sequence of numbers returned by successive invocations |
| with the same object `e` is randomly distributed with some |
| probability density function `p(x)`] |
| [amortized constant number of invocations of `e`]] |
| [[`os << x`] [`std::ostream&`] [writes a textual representation for the |
| parameters and additional internal data of |
| the distribution `x` to `os`. |
| post: The `os.fmtflags` and fill character |
| are unchanged.] |
| [O(size of state)]] |
| [[`is >> u`] [`std::istream&`] [restores the parameters and additional |
| internal data of the distribution `u`. |
| pre: `is` provides a textual representation |
| that was previously written by `operator<<` |
| post: The `is.fmtflags` are unchanged.] |
| [O(size of state)]] |
| ] |
| |
| Additional requirements: The sequence of numbers produced by repeated |
| invocations of `x(e)` does not change whether or not `os << x` is invoked |
| between any of the invocations `x(e)`. If a textual representation is written |
| using `os << x` and that representation is restored into the same or a |
| different object `y` of the same type using `is >> y`, repeated invocations |
| of `y(e)` produce the same sequence of random numbers as would repeated |
| invocations of `x(e)`. |
| |
| [endsect] |