ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/rng.C
(Generate patch)

Comparing deliantra/server/common/rng.C (file contents):
Revision 1.1 by root, Fri Jul 2 02:00:47 2010 UTC vs.
Revision 1.2 by root, Sat Jul 10 21:07:47 2010 UTC

18 * <http://www.gnu.org/licenses/>. 18 * <http://www.gnu.org/licenses/>.
19 * 19 *
20 * The authors can be reached via e-mail to <support@deliantra.net> 20 * The authors can be reached via e-mail to <support@deliantra.net>
21 */ 21 */
22 22
23#include <cmath>
24
23#include <global.h> 25#include <global.h>
24 26
25rand_gen rndm, rmg_rndm; 27rand_gen rndm, rmg_rndm;
26 28
27void noinline 29void noinline
28tausworthe_random_generator::seed (uint32_t seed) 30tausworthe_rng::seed (uint32_t seed)
29{ 31{
30 state [0] = seed * 69069U; if (state [0] < 2U) state [0] += 2U; 32 state [0] = seed * 69069U; if (state [0] < 2U) state [0] += 2U;
31 state [1] = state [0] * 69069U; if (state [1] < 8U) state [1] += 8U; 33 state [1] = state [0] * 69069U; if (state [1] < 8U) state [1] += 8U;
32 state [2] = state [1] * 69069U; if (state [2] < 16U) state [2] += 16U; 34 state [2] = state [1] * 69069U; if (state [2] < 16U) state [2] += 16U;
33 state [3] = state [2] * 69069U; if (state [3] < 128U) state [3] += 128U; 35 state [3] = state [2] * 69069U; if (state [3] < 128U) state [3] += 128U;
35 for (int i = 11; --i; ) 37 for (int i = 11; --i; )
36 next (); 38 next ();
37} 39}
38 40
39uint32_t 41uint32_t
40tausworthe_random_generator::next () 42tausworthe_rng::next ()
41{ 43{
42 state [0] = ((state [0] & 0xFFFFFFFEU) << 18U) ^ (((state [0] << 6U) ^ state [0]) >> 13U); 44 state [0] = ((state [0] & 0xFFFFFFFEU) << 18U) ^ (((state [0] << 6U) ^ state [0]) >> 13U);
43 state [1] = ((state [1] & 0xFFFFFFF8U) << 2U) ^ (((state [1] << 2U) ^ state [1]) >> 27U); 45 state [1] = ((state [1] & 0xFFFFFFF8U) << 2U) ^ (((state [1] << 2U) ^ state [1]) >> 27U);
44 state [2] = ((state [2] & 0xFFFFFFF0U) << 7U) ^ (((state [2] << 13U) ^ state [2]) >> 21U); 46 state [2] = ((state [2] & 0xFFFFFFF0U) << 7U) ^ (((state [2] << 13U) ^ state [2]) >> 21U);
45 state [3] = ((state [3] & 0xFFFFFF80U) << 13U) ^ (((state [3] << 3U) ^ state [3]) >> 12U); 47 state [3] = ((state [3] & 0xFFFFFF80U) << 13U) ^ (((state [3] << 3U) ^ state [3]) >> 12U);
46 48
47 return state [0] ^ state [1] ^ state [2] ^ state [3]; 49 return state [0] ^ state [1] ^ state [2] ^ state [3];
48} 50}
49 51
50void noinline 52void noinline
51r250521_random_generator::seed (uint32_t seed) 53r250521_rng::seed (uint32_t seed)
52{ 54{
53 xorshift_random_generator rng; 55 xorshift_rng rng;
54 56
55 rng.seed (seed); 57 rng.seed (seed);
56 58
57 r250.seed_rng (rng); 59 r250.seed_rng (rng);
58 r521.seed_rng (rng); 60 r521.seed_rng (rng);
59} 61}
60 62
61uint32_t 63uint32_t
62r250521_random_generator::next () 64r250521_rng::next ()
63{ 65{
64 return r250.next () ^ r521.next (); 66 return r250.next () ^ r521.next ();
65} 67}
66 68
67template<class generator> 69template<class generator>
83random_number_generator<generator>::get_u64 () 85random_number_generator<generator>::get_u64 ()
84{ 86{
85 return (uint64_t (get_u32 ()) << 32U) | get_u32 (); 87 return (uint64_t (get_u32 ()) << 32U) | get_u32 ();
86} 88}
87 89
90template<class generator>
91float noinline
92random_number_generator<generator>::get_float ()
93{
94 return this->next () / (float)0x100000000ULL;
95}
96
97template<class generator>
98double noinline
99random_number_generator<generator>::get_double ()
100{
101 return this->next () / (double)0x100000000ULL;
102}
103
88// return a number within (min .. max) 104// return a number within (min .. max)
89template<class generator> 105template<class generator>
90int 106int
91random_number_generator<generator>::get_range (int r_min, int r_max) 107random_number_generator<generator>::get_range (int r_min, int r_max)
92{ 108{
93 return r_min + get_range (max (r_max - r_min + 1, 0)); 109 return r_min + get_range (max (r_max - r_min + 1, 0));
94} 110}
95 111
96template struct random_number_generator<tausworthe_random_generator>; 112template<class generator>
97template struct random_number_generator<xorshift_random_generator>; 113uint32_t
98template struct random_number_generator<freeciv_random_generator>; 114random_number_generator<generator>::poisson (double mean)
99template struct random_number_generator<r250_random_generator>; 115{
100template struct random_number_generator<r521_random_generator>; 116 double g = std::exp (-mean);
101template struct random_number_generator<r250521_random_generator>; 117 uint32_t em = 0;
102 118
119 double t = get_double ();
120
121 while (t > g)
122 {
123 ++em;
124 t *= get_double ();
125 }
126
127 return em;
128}
129
130template struct random_number_generator<bcpl_rng>;
131template struct random_number_generator<borosh_niederreiter_rng>;
132template struct random_number_generator<tausworthe_rng>;
133template struct random_number_generator<xorshift_rng>;
134template struct random_number_generator<freeciv_rng>;
135template struct random_number_generator<r250_rng>;
136template struct random_number_generator<r521_rng>;
137template struct random_number_generator<r250521_rng>;
138

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines