/* * Xorshift Pseudo Random Number Generator based on work by David Blackman * and Sebastiano Vigna (vigna@acm.org). * * "Further scramblings of Marsaglia's xorshift generators" * http://vigna.di.unimi.it/ftp/papers/xorshiftplus.pdf * http://prng.di.unimi.it/xoroshiro128plusplus.c * * To the extent possible under law, the author has dedicated all copyright * and related and neighboring rights to this software to the public domain * worldwide. This software is distributed without any warranty. * * See . * * This is xoroshiro128++ 1.0, one of our all-purpose, rock-solid, * small-state generators. It is extremely (sub-ns) fast and it passes all * tests we are aware of, but its state space is large enough only for * mild parallelism. */ #include static inline uint64_t rotl(const uint64_t x, int k) { return (x << k) | (x >> (64 - k)); } uint64_t vdev_draid_rand(uint64_t *s) { const uint64_t s0 = s[0]; uint64_t s1 = s[1]; const uint64_t result = rotl(s0 + s1, 17) + s0; s1 ^= s0; s[0] = rotl(s0, 49) ^ s1 ^ (s1 << 21); // a, b s[1] = rotl(s1, 28); // c return (result); }