1 | /* |
1 | /* |
2 | * This file is part of Deliantra, the Roguelike Realtime MMORPG. |
2 | * This file is part of Deliantra, the Roguelike Realtime MMORPG. |
3 | * |
3 | * |
|
|
4 | * Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team |
4 | * Copyright (©) 2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
5 | * Copyright (©) 2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
5 | * |
6 | * |
6 | * Deliantra is free software: you can redistribute it and/or modify it under |
7 | * Deliantra is free software: you can redistribute it and/or modify it under |
7 | * the terms of the Affero GNU General Public License as published by the |
8 | * the terms of the Affero GNU General Public License as published by the |
8 | * Free Software Foundation, either version 3 of the License, or (at your |
9 | * Free Software Foundation, either version 3 of the License, or (at your |
… | |
… | |
24 | |
25 | |
25 | #include <global.h> |
26 | #include <global.h> |
26 | |
27 | |
27 | rand_gen rndm, rmg_rndm; |
28 | rand_gen rndm, rmg_rndm; |
28 | |
29 | |
29 | void noinline |
30 | ecb_noinline void |
30 | tausworthe_rng::seed (uint32_t seed) |
31 | tausworthe_rng::seed (uint32_t seed) |
31 | { |
32 | { |
32 | state [0] = seed * 69069U; if (state [0] < 2U) state [0] += 2U; |
33 | state [0] = seed * 69069U; if (state [0] < 2U) state [0] += 2U; |
33 | state [1] = state [0] * 69069U; if (state [1] < 8U) state [1] += 8U; |
34 | state [1] = state [0] * 69069U; if (state [1] < 8U) state [1] += 8U; |
34 | state [2] = state [1] * 69069U; if (state [2] < 16U) state [2] += 16U; |
35 | state [2] = state [1] * 69069U; if (state [2] < 16U) state [2] += 16U; |
… | |
… | |
47 | state [3] = ((state [3] & 0xFFFFFF80U) << 13U) ^ (((state [3] << 3U) ^ state [3]) >> 12U); |
48 | state [3] = ((state [3] & 0xFFFFFF80U) << 13U) ^ (((state [3] << 3U) ^ state [3]) >> 12U); |
48 | |
49 | |
49 | return state [0] ^ state [1] ^ state [2] ^ state [3]; |
50 | return state [0] ^ state [1] ^ state [2] ^ state [3]; |
50 | } |
51 | } |
51 | |
52 | |
52 | void noinline |
53 | ecb_noinline void |
53 | r250521_rng::seed (uint32_t seed) |
54 | r250521_rng::seed (uint32_t seed) |
54 | { |
55 | { |
55 | xorshift_rng rng; |
56 | xorshift_rng rng; |
56 | |
57 | |
57 | rng.seed (seed); |
58 | rng.seed (seed); |
… | |
… | |
72 | { |
73 | { |
73 | return (this->next () * (uint64_t)num) >> 32U; |
74 | return (this->next () * (uint64_t)num) >> 32U; |
74 | } |
75 | } |
75 | |
76 | |
76 | template<class generator> |
77 | template<class generator> |
77 | uint32_t noinline |
78 | ecb_noinline uint32_t |
78 | random_number_generator<generator>::get_u32 () |
79 | random_number_generator<generator>::get_u32 () |
79 | { |
80 | { |
80 | return generator::next (); |
81 | return generator::next (); |
81 | } |
82 | } |
82 | |
83 | |
83 | template<class generator> |
84 | template<class generator> |
84 | uint64_t noinline |
85 | ecb_noinline uint64_t |
85 | random_number_generator<generator>::get_u64 () |
86 | random_number_generator<generator>::get_u64 () |
86 | { |
87 | { |
87 | return (uint64_t (get_u32 ()) << 32U) | get_u32 (); |
88 | return (uint64_t (get_u32 ()) << 32U) | get_u32 (); |
88 | } |
89 | } |
89 | |
90 | |
90 | template<class generator> |
91 | template<class generator> |
91 | float noinline |
92 | ecb_noinline float |
92 | random_number_generator<generator>::get_float () |
93 | random_number_generator<generator>::get_float () |
93 | { |
94 | { |
94 | return this->next () / (float)0x100000000ULL; |
95 | return this->next () / (float)0x100000000ULL; |
95 | } |
96 | } |
96 | |
97 | |
97 | template<class generator> |
98 | template<class generator> |
98 | double noinline |
99 | ecb_noinline double |
99 | random_number_generator<generator>::get_double () |
100 | random_number_generator<generator>::get_double () |
100 | { |
101 | { |
101 | return this->next () / (double)0x100000000ULL; |
102 | return this->next () / (double)0x100000000ULL; |
102 | } |
103 | } |
103 | |
104 | |