36 lines
1.3 KiB
C
36 lines
1.3 KiB
C
#include "krandom.h"
|
|
|
|
/*
|
|
This is a fixed-increment version of Java 8's SplittableRandom generator
|
|
See http://dx.doi.org/10.1145/2714064.2660195 and
|
|
http://docs.oracle.com/javase/8/docs/api/java/util/SplittableRandom.html
|
|
It is a very fast generator passing BigCrush, and it can be useful if
|
|
for some reason you absolutely want 64 bits of state; otherwise, we
|
|
rather suggest to use a xoroshiro128+ (for moderately parallel
|
|
computations) or xorshift1024* (for massively parallel computations)
|
|
generator.
|
|
*/
|
|
|
|
// The state can be seeded with any (upto) 64 bit integer value.
|
|
typedef uint64 _state_t;
|
|
|
|
void* splitmix64_init(uint64 seed){
|
|
_state_t* state=malloc(sizeof(_state_t));
|
|
*state=seed;
|
|
return state;
|
|
}
|
|
|
|
uint64 splitmix64_next(void* _state) {
|
|
_state_t* state=_state;
|
|
// increment the state variable
|
|
*state += 0x9e3779b97f4a7c15;
|
|
// copy the state to a working variable
|
|
uint64 z = *state;
|
|
// xor the variable with the variable right bit shifted 30 then multiply by a constant
|
|
z = (z ^ (z>>30)) * 0xbf58476d1ce4e5b9;
|
|
// xor the variable with the variable right bit shifted 27 then multiply by a constant
|
|
z = (z ^ (z>>27)) * 0x94d049bb133111eb;
|
|
// return the variable xored with itself right bit shifted 31
|
|
return z ^ (z>>31);
|
|
}
|