44
55NumberGenerator::NumberGenerator (uint64_t seed)
66{
7- s [0 ] = splitmix64 (seed);
8- s [1 ] = splitmix64 (seed);
7+ state [0 ] = splitmix64 (seed);
8+ state [1 ] = splitmix64 (seed);
99 // suppress the warning with jump calling it
1010 std::ignore = getRandomDouble ();
1111}
@@ -17,31 +17,31 @@ NumberGenerator::NumberGenerator(uint64_t seed)
1717 */
1818double NumberGenerator::getRandomDouble ()
1919{
20- const uint64_t s0 = s [0 ];
21- uint64_t s1 = s [1 ];
20+ const uint64_t state0 = state [0 ];
21+ uint64_t state1 = state [1 ];
2222
2323 // create random number using the internal state
24- const uint64_t result = s0 + s1 ;
24+ const uint64_t result = state0 + state1 ;
2525
2626 // mix up the internal state again
27- s1 ^= s0 ;
28- s [0 ] = rotl (s0 , 24 ) ^ s1 ^ (s1 << 16 ); // a, b
29- s [1 ] = rotl (s1 , 37 ); // c
27+ state1 ^= state0 ;
28+ state [0 ] = rotl (state0 , 24 ) ^ state1 ^ (state1 << 16 ); // a, b
29+ state [1 ] = rotl (state1 , 37 ); // c
3030
3131 // return, shifting result into [0,1)
32- return (result >> 11 ) * (1.0 / (1ULL << 53 ));;
32+ return (result >> 11 ) * (1.0 / (1ULL << 53 ));
3333}
3434
3535/* *
3636 * @brief bit shifts x
3737 *
38- * @param x int to shift
39- * @param k bits to shift by
38+ * @param value int to shift
39+ * @param shift bits to shift by
4040 * @return uint64_t
4141 */
42- inline uint64_t NumberGenerator::rotl (const uint64_t x , int k )
42+ uint64_t NumberGenerator::rotl (uint64_t value , int shift )
4343{
44- return (x << k ) | (x >> (64 - k ));
44+ return (value << shift ) | (value >> (64 - shift ));
4545}
4646
4747
@@ -51,29 +51,29 @@ inline uint64_t NumberGenerator::rotl(const uint64_t x, int k)
5151
5252void NumberGenerator::jump ()
5353{
54- static const uint64_t JUMP[] = { 0xdf900294d8f554a5 , 0x170865df4b3201fc };
54+ static const std::array< uint64_t , 2 > JUMP = { 0xdf900294d8f554a5 , 0x170865df4b3201fc };
5555
56- uint64_t s0 = 0 ;
57- uint64_t s1 = 0 ;
58- for (int i = 0 ; i < sizeof JUMP / sizeof *JUMP; i++ )
56+ uint64_t state0 = 0 ;
57+ uint64_t state1 = 0 ;
58+ for (const auto & jump_val : JUMP)
5959 {
60- for (int b = 0 ; b < 64 ; b ++) {
61- if (JUMP[i] & UINT64_C (1 ) << b ) {
62- s0 ^= s [0 ];
63- s1 ^= s [1 ];
60+ for (int bit_idx = 0 ; bit_idx < 64 ; bit_idx ++) {
61+ if ((jump_val & ( UINT64_C (1 ) << bit_idx)) != 0 ) {
62+ state0 ^= state [0 ];
63+ state1 ^= state [1 ];
6464 }
65- getRandomDouble ();
65+ std::ignore = getRandomDouble ();
6666 }
6767 }
6868
69- s [0 ] = s0 ;
70- s [1 ] = s1 ;
69+ state [0 ] = state0 ;
70+ state [1 ] = state1 ;
7171}
7272
73- uint64_t splitmix64 (uint64_t & seed)
73+ uint64_t NumberGenerator:: splitmix64 (uint64_t & seed)
7474{
75- uint64_t z = (seed += 0x9E3779B97F4A7C15ULL );
76- z = (z ^ (z >> 30 )) * 0xBF58476D1CE4E5B9ULL ;
77- z = (z ^ (z >> 27 )) * 0x94D049BB133111EBULL ;
78- return z ^ (z >> 31 );
75+ uint64_t result = (seed += 0x9E3779B97F4A7C15ULL );
76+ result = (result ^ (result >> 30 )) * 0xBF58476D1CE4E5B9ULL ;
77+ result = (result ^ (result >> 27 )) * 0x94D049BB133111EBULL ;
78+ return result ^ (result >> 31 );
7979}
0 commit comments