[Lemon-commits] [lemon_svn] deba: r2995 - hugo/trunk/lemon
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 21:51:43 CET 2006
Author: deba
Date: Tue Oct 17 12:40:28 2006
New Revision: 2995
Modified:
hugo/trunk/lemon/random.h
Log:
Little modification on interface and documentation
Modified: hugo/trunk/lemon/random.h
==============================================================================
--- hugo/trunk/lemon/random.h (original)
+++ hugo/trunk/lemon/random.h Tue Oct 17 12:40:28 2006
@@ -422,37 +422,44 @@
///
/// The generator gives back random numbers of serveral types. To
/// get a random number from a range of a floating point type you
- /// can use one form of the \c operator(). If you want to get random
- /// number from a the {0, 1, ..., n-1} integer range use the \c
- /// operator[]. And to get random number from the whole range of an
- /// integer type you can use the \c integer() or \c uinteger()
- /// functions. After all you can get random bool with equal chance
- /// or given probability with the \c boolean() member function.
+ /// can use one form of the \c operator() or the \c real() member
+ /// function. If you want to get random number from the {0, 1, ...,
+ /// n-1} integer range use the \c operator[] or the \c integer()
+ /// method. And to get random number from the whole range of an
+ /// integer type you can use the argumentless \c integer() or \c
+ /// uinteger() functions. After all you can get random bool with
+ /// equal chance of true and false or given probability of true
+ /// result with the \c boolean() member functions.
///
///\code
- /// int a = rnd[100000]; // 0..99999
+ /// // The commented code is identical to the other
+ /// double a = rnd(); // [0.0, 1.0)
+ /// // double a = rnd.real(); // [0.0, 1.0)
+ /// double b = rnd(100.0); // [0.0, 100.0)
+ /// // double b = rnd.real(100.0); // [0.0, 100.0)
+ /// double c = rnd(1.0, 2.0); // [1.0, 2.0)
+ /// // double c = rnd.real(1.0, 2.0); // [1.0, 2.0)
+ /// int d = rnd[100000]; // 0..99999
+ /// // int d = rnd.integer(100000); // 0..99999
+ /// int e = rnd[6] + 1; // 1..6
+ /// // int e = rnd.integer(1, 1 + 6); // 1..6
/// int b = rnd.uinteger<int>(); // 0 .. 2^31 - 1
/// int c = rnd.integer<int>(); // - 2^31 .. 2^31 - 1
- /// double d = rnd(); // [0.0, 1.0)
- /// double e = rnd(100.0); // [0.0, 100.0)
- /// double f = rnd(1.0, 2.0); // [1.0, 2.0)
/// bool g = rnd.boolean(); // P(g = true) = 0.5
/// bool h = rnd.boolean(0.8); // P(h = true) = 0.8
///\endcode
///
- /// The lemon provides a global instance of the random number generator
- /// which name is \c rnd. Usually it is a good programming convenience
- /// to use this global generator to get random numbers.
+ /// The lemon provides a global instance of the random number
+ /// generator which name is \ref lemon::rnd "rnd". Usually it is a
+ /// good programming convenience to use this global generator to get
+ /// random numbers.
///
/// \author Balazs Dezso
class Random {
private:
-#if WORD_BIT == 32
- typedef unsigned int Word;
-#elif WORD_BIT == 64
+ // architecture word
typedef unsigned long Word;
-#endif
_random_bits::RandomCore<Word> core;
@@ -486,7 +493,9 @@
/// \brief Copy constructor
///
/// Copy constructor. The generated sequence will be identical to
- /// the other sequence.
+ /// the other sequence. It can be used to save the current state
+ /// of the generator and later use it to generate the same
+ /// sequence.
Random(const Random& other) {
core.copyState(other.core);
}
@@ -494,7 +503,9 @@
/// \brief Assign operator
///
/// Assign operator. The generated sequence will be identical to
- /// the other sequence.
+ /// the other sequence. It can be used to save the current state
+ /// of the generator and later use it to generate the same
+ /// sequence.
Random& operator=(const Random& other) {
if (&other != this) {
core.copyState(other.core);
@@ -504,15 +515,38 @@
/// \brief Returns a random real number
///
- /// It returns a random real number from the range [0, 1). The default
- /// result type of this function is double.
+ /// It returns a random real number from the range [0, 1). The
+ /// default Number type is double.
template <typename Number>
- Number operator()() {
+ Number real() {
return _random_bits::RealConversion<Number, Word>::convert(core);
}
+ double real() {
+ return real<double>();
+ }
+
+ /// \brief Returns a random real number
+ ///
+ /// It returns a random real number from the range [0, b).
+ template <typename Number>
+ Number real(Number b) {
+ return real<Number>() * b;
+ }
+
+ /// \brief Returns a random real number
+ ///
+ /// It returns a random real number from the range [a, b).
+ template <typename Number>
+ Number real(Number a, Number b) {
+ return real<Number>() * (b - a) + a;
+ }
+
+ /// \brief Returns a random real number
+ ///
+ /// It returns a random double from the range [0, 1).
double operator()() {
- return operator()<double>();
+ return real<double>();
}
/// \brief Returns a random real number
@@ -520,7 +554,7 @@
/// It returns a random real number from the range [0, b).
template <typename Number>
Number operator()(Number b) {
- return operator()<Number>() * b;
+ return real<Number>() * b;
}
/// \brief Returns a random real number
@@ -528,15 +562,31 @@
/// It returns a random real number from the range [a, b).
template <typename Number>
Number operator()(Number a, Number b) {
- return operator()<Number>() * (b - a) + a;
+ return real<Number>() * (b - a) + a;
+ }
+
+ /// \brief Returns a random integer from a range
+ ///
+ /// It returns a random integer from the range {0, 1, ..., b - 1}.
+ template <typename Number>
+ Number integer(Number b) {
+ return _random_bits::Mapping<Number, Word>::map(core, b);
}
/// \brief Returns a random integer from a range
///
- /// It returns a random integer from the range {0, 1, ..., bound - 1}.
+ /// It returns a random integer from the range {a, a + 1, ..., b - 1}.
template <typename Number>
- Number operator[](const Number& bound) {
- return _random_bits::Mapping<Number, Word>::map(core, bound);
+ Number integer(Number a, Number b) {
+ return _random_bits::Mapping<Number, Word>::map(core, b - a) + a;
+ }
+
+ /// \brief Returns a random integer from a range
+ ///
+ /// It returns a random integer from the range {0, 1, ..., b - 1}.
+ template <typename Number>
+ Number operator[](Number b) {
+ return _random_bits::Mapping<Number, Word>::map(core, b);
}
/// \brief Returns a random non-negative integer
@@ -586,9 +636,6 @@
};
- /// \brief Global random number generator instance
- ///
- /// A global mersenne twister random number generator instance
extern Random rnd;
}
More information about the Lemon-commits
mailing list