| [/ |
| / 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 Header <boost/nondet_random.hpp> Synopsis] |
| |
| namespace boost { |
| class random_device; |
| } // namespace boost |
| |
| [endsect] |
| |
| [section Class random_device] |
| |
| [section Synopsis] |
| |
| class random_device : noncopyable |
| { |
| public: |
| typedef unsigned int result_type; |
| static const bool has_fixed_range = true; |
| static const result_type min_value = /* implementation defined */; |
| static const result_type max_value = /* implementation defined */; |
| result_type min() const; |
| result_type max() const; |
| explicit random_device(const std::string& token = default_token); |
| ~random_device(); |
| double entropy() const; |
| unsigned int operator()(); |
| }; |
| |
| [endsect] |
| |
| [section Description] |
| |
| Class `random_device` models a non-deterministic random number generator. It |
| uses one or more implementation-defined stochastic processes to generate a |
| sequence of uniformly distributed non-deterministic random numbers. For those |
| environments where a non-deterministic random number generator is not |
| available, class random_device must not be implemented. See |
| |
| [:"Randomness Recommendations for Security", D. Eastlake, S. Crocker, |
| J. Schiller, Network Working Group, RFC 1750, December 1994] |
| |
| for further discussions. |
| |
| [note Some operating systems abstract the computer hardware enough to make it |
| difficult to non-intrusively monitor stochastic processes. However, several do |
| provide a special device for exactly this purpose. It seems to be impossible |
| to emulate the functionality using Standard C++ only, so users should be aware |
| that this class may not be available on all platforms.] |
| |
| [endsect] |
| |
| [section Members] |
| |
| explicit random_device(const std::string& token = default_token) |
| |
| Effects: Constructs a random_device, optionally using the given token as an |
| access specification (for example, a URL) to some implementation-defined |
| service for monitoring a stochastic process. |
| |
| double entropy() const |
| |
| Returns: An entropy estimate for the random numbers returned by `operator()`, |
| in the range `min()` to `log2(max()+1)`. A deterministic random number |
| generator (e.g. a pseudo-random number engine) has entropy 0. |
| |
| Throws: Nothing. |
| |
| [endsect] |
| |
| Implementation Note for Linux |
| On the Linux operating system, token is interpreted as a filesystem path. It |
| is assumed that this path denotes an operating system pseudo-device which |
| generates a stream of non-deterministic random numbers. The pseudo-device |
| should never signal an error or end-of-file. Otherwise, std::ios_base::failure |
| is thrown. By default, random_device uses the /dev/urandom pseudo-device to |
| retrieve the random numbers. Another option would be to specify the |
| /dev/random pseudo-device, which blocks on reads if the entropy pool has no |
| more random bits available. |
| |
| [endsect] |
| |
| [section Performance] |
| |
| The test program nondet_random_speed.cpp measures the execution times of the |
| nondet_random.hpp implementation of the above algorithms in a tight loop. |
| The performance has been evaluated on a Pentium Pro 200 MHz with gcc 2.95.2, |
| Linux 2.2.13, glibc 2.1.2. |
| |
| [table preformance |
| [[class] [time per invocation \[usec\]]] |
| [[random_device] [92.0]] |
| ] |
| |
| The measurement error is estimated at +/- 1 usec. |
| |
| [endsect] |