File tree Expand file tree Collapse file tree 1 file changed +54
-0
lines changed Expand file tree Collapse file tree 1 file changed +54
-0
lines changed Original file line number Diff line number Diff line change
1
+ #ifndef KRNG_H
2
+ #define KRNG_H
3
+
4
+ typedef struct {
5
+ uint64_t s [2 ];
6
+ } krng_t ;
7
+
8
+ static inline uint64_t kr_splitmix64 (uint64_t x )
9
+ {
10
+ uint64_t z = (x += 0x9E3779B97F4A7C15ULL );
11
+ z = (z ^ (z >> 30 )) * 0xBF58476D1CE4E5B9ULL ;
12
+ z = (z ^ (z >> 27 )) * 0x94D049BB133111EBULL ;
13
+ return z ^ (z >> 31 );
14
+ }
15
+
16
+ static inline uint64_t kr_rand_r (krng_t * r )
17
+ {
18
+ const uint64_t s0 = r -> s [0 ];
19
+ uint64_t s1 = r -> s [1 ];
20
+ const uint64_t result = s0 + s1 ;
21
+ s1 ^= s0 ;
22
+ r -> s [0 ] = (s0 << 55 | s0 >> 9 ) ^ s1 ^ (s1 << 14 );
23
+ r -> s [1 ] = s0 << 36 | s0 >> 28 ;
24
+ return result ;
25
+ }
26
+
27
+ static inline void kr_jump_r (krng_t * r )
28
+ {
29
+ static const uint64_t JUMP [] = { 0xbeac0467eba5facbULL , 0xd86b048b86aa9922ULL };
30
+ uint64_t s0 = 0 , s1 = 0 ;
31
+ int i , b ;
32
+ for (i = 0 ; i < 2 ; ++ i )
33
+ for (b = 0 ; b < 64 ; b ++ ) {
34
+ if (JUMP [i ] & 1ULL << b )
35
+ s0 ^= r -> s [0 ], s1 ^= r -> s [1 ];
36
+ kr_rand_r (r );
37
+ }
38
+ r -> s [0 ] = s0 , r -> s [1 ] = s1 ;
39
+ }
40
+
41
+ static inline void kr_srand_r (krng_t * r , uint64_t seed )
42
+ {
43
+ r -> s [0 ] = kr_splitmix64 (seed );
44
+ r -> s [1 ] = kr_splitmix64 (r -> s [0 ]);
45
+ }
46
+
47
+ static inline double kr_drand_r (krng_t * r )
48
+ {
49
+ union { uint64_t i ; double d ; } u ;
50
+ u .i = 0x3FFULL << 52 | kr_rand_r (r ) >> 12 ;
51
+ return u .d - 1.0 ;
52
+ }
53
+
54
+ #endif
You can’t perform that action at this time.
0 commit comments