ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/rng.C
Revision: 1.9
Committed: Sat Nov 17 23:40:00 2018 UTC (5 years, 5 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.8: +1 -0 lines
Log Message:
copyright update 2018

File Contents

# Content
1 /*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 *
4 * Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team
5 * Copyright (©) 2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
6 *
7 * Deliantra is free software: you can redistribute it and/or modify it under
8 * the terms of the Affero GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the Affero GNU General Public License
18 * and the GNU General Public License along with this program. If not, see
19 * <http://www.gnu.org/licenses/>.
20 *
21 * The authors can be reached via e-mail to <support@deliantra.net>
22 */
23
24 #include <cmath>
25
26 #include <global.h>
27
28 rand_gen rndm, rmg_rndm;
29
30 ecb_noinline void
31 tausworthe_rng::seed (uint32_t seed)
32 {
33 state [0] = seed * 69069U; if (state [0] < 2U) state [0] += 2U;
34 state [1] = state [0] * 69069U; if (state [1] < 8U) state [1] += 8U;
35 state [2] = state [1] * 69069U; if (state [2] < 16U) state [2] += 16U;
36 state [3] = state [2] * 69069U; if (state [3] < 128U) state [3] += 128U;
37
38 for (int i = 11; --i; )
39 next ();
40 }
41
42 uint32_t
43 tausworthe_rng::next ()
44 {
45 state [0] = ((state [0] & 0xFFFFFFFEU) << 18U) ^ (((state [0] << 6U) ^ state [0]) >> 13U);
46 state [1] = ((state [1] & 0xFFFFFFF8U) << 2U) ^ (((state [1] << 2U) ^ state [1]) >> 27U);
47 state [2] = ((state [2] & 0xFFFFFFF0U) << 7U) ^ (((state [2] << 13U) ^ state [2]) >> 21U);
48 state [3] = ((state [3] & 0xFFFFFF80U) << 13U) ^ (((state [3] << 3U) ^ state [3]) >> 12U);
49
50 return state [0] ^ state [1] ^ state [2] ^ state [3];
51 }
52
53 ecb_noinline void
54 r250521_rng::seed (uint32_t seed)
55 {
56 xorshift_rng rng;
57
58 rng.seed (seed);
59
60 r250.seed_rng (rng);
61 r521.seed_rng (rng);
62 }
63
64 uint32_t
65 r250521_rng::next ()
66 {
67 return r250.next () ^ r521.next ();
68 }
69
70 template<class generator>
71 uint32_t
72 random_number_generator<generator>::get_range (uint32_t num)
73 {
74 return (this->next () * (uint64_t)num) >> 32U;
75 }
76
77 template<class generator>
78 ecb_noinline uint32_t
79 random_number_generator<generator>::get_u32 ()
80 {
81 return generator::next ();
82 }
83
84 template<class generator>
85 ecb_noinline uint64_t
86 random_number_generator<generator>::get_u64 ()
87 {
88 return (uint64_t (get_u32 ()) << 32U) | get_u32 ();
89 }
90
91 template<class generator>
92 ecb_noinline float
93 random_number_generator<generator>::get_float ()
94 {
95 return this->next () / (float)0x100000000ULL;
96 }
97
98 template<class generator>
99 ecb_noinline double
100 random_number_generator<generator>::get_double ()
101 {
102 return this->next () / (double)0x100000000ULL;
103 }
104
105 // return a number within (min .. max)
106 template<class generator>
107 int
108 random_number_generator<generator>::get_range (int r_min, int r_max)
109 {
110 return r_min + get_range (max (r_max - r_min + 1, 0));
111 }
112
113 template<class generator>
114 uint32_t
115 random_number_generator<generator>::poisson (double mean)
116 {
117 double g = std::exp (-mean);
118 uint32_t em = 0;
119
120 double t = get_double ();
121
122 while (t > g)
123 {
124 ++em;
125 t *= get_double ();
126 }
127
128 return em;
129 }
130
131 template struct random_number_generator<bcpl_rng>;
132 template struct random_number_generator<borosh_niederreiter_rng>;
133 template struct random_number_generator<tausworthe_rng>;
134 template struct random_number_generator<xorshift_rng>;
135 template struct random_number_generator<freeciv_rng>;
136 template struct random_number_generator<r250_rng>;
137 template struct random_number_generator<r521_rng>;
138 template struct random_number_generator<r250521_rng>;
139