QGIS API Documentation  2.6.0-Brighton
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
mersenne-twister.h
Go to the documentation of this file.
1 /*
2  * The Mersenne Twister pseudo-random number generator (PRNG)
3  *
4  * This is an implementation of fast PRNG called MT19937,
5  * meaning it has a period of 2^19937-1, which is a Mersenne
6  * prime.
7  *
8  * This PRNG is fast and suitable for non-cryptographic code.
9  * For instance, it would be perfect for Monte Carlo simulations,
10  * etc.
11  *
12  * This code has been designed as a drop-in replacement for libc rand and
13  * srand(). If you need to mix them, you should encapsulate this code in a
14  * namespace.
15  *
16  * Written by Christian Stigen Larsen
17  * 2012-01-11 -- http://csl.sublevel3.org
18  *
19  * Distributed under the modified BSD license.
20  */
21 
22 #ifndef MERSENNE_TWISTER_H
23 #define MERSENNE_TWISTER_H
24 
25 #ifndef _MSC_VER
26 #include <stdint.h>
27 #else
28 typedef __int32 int32_t;
29 typedef unsigned __int32 uint32_t;
30 typedef __int64 int64_t;
31 typedef unsigned __int64 uint64_t;
32 #endif
33 #include <limits>
34 
35 #ifdef __cplusplus
36 extern "C"
37 {
38 #endif
39 
40  /*
41  * Maximum number you can get from rand().
42  */
43 #define MD_RAND_MAX std::numeric_limits<int32_t>::max()
44 
45  /*
46  * Initialize the number generator with given seed.
47  * (LIBC REPLACEMENT FUNCTION)
48  */
49  void mt_srand( unsigned seed_value );
50 
51  /*
52  * Extract a pseudo-random integer in the range 0 ... MD_RAND_MAX.
53  * (LIBC REPLACEMENT FUNCTION)
54  */
55  int mt_rand();
56 
57  /*
58  * Extract a pseudo-random unsigned 32-bit integer in the range 0 ... MD_UINT32_MAX
59  */
60  uint32_t rand_u32();
61 
62  /*
63  * Combine two unsigned 32-bit pseudo-random numbers into one 64-bit
64  */
65  uint64_t rand_u64();
66 
67  /*
68  * Initialize Mersenne Twister with given seed value.
69  */
70  void seed( uint32_t seed_value );
71 
72  /*
73  * Return a random float in the CLOSED range [0, 1]
74  * Mnemonic: randf_co = random float 0=closed 1=closed
75  */
76  float randf_cc();
77 
78  /*
79  * Return a random float in the OPEN range [0, 1>
80  * Mnemonic: randf_co = random float 0=closed 1=open
81  */
82  float randf_co();
83 
84  /*
85  * Return a random float in the OPEN range <0, 1>
86  * Mnemonic: randf_oo = random float 0=open 1=open
87  */
88  float randf_oo();
89 
90  /*
91  * Return a random double in the CLOSED range [0, 1]
92  * Mnemonic: randd_co = random double 0=closed 1=closed
93  */
94  double randd_cc();
95 
96  /*
97  * Return a random double in the OPEN range [0, 1>
98  * Mnemonic: randd_co = random double 0=closed 1=open
99  */
100  double randd_co();
101 
102  /*
103  * Return a random double in the OPEN range <0, 1>
104  * Mnemonic: randd_oo = random double 0=open 1=open
105  */
106  double randd_oo();
107 
108 #ifdef __cplusplus
109 } // extern "C"
110 #endif
111 
112 #endif // MERSENNE_TWISTER_H