This documentation is automatically generated by competitive-verifier/competitive-verifier
#include "other/xor-shift.hpp"
Xorshift は擬似乱数生成法の一つである.
周期が $2^{64}-1$ となる実装を示した.
XorShift(seed)
: シード値 seed
で初期化する.get()
: $[0, 2^{64})$ で生成した乱数を返す.get(r)
: $[0, r)$ で生成した乱数を返す. r
は32bit整数に限る. 64bitで生成したい場合は例えば get()
を r
で割った余りを求めるとよい.get(l, r)
: $[l, r)$ で生成した乱数を返す.probability()
: $[0.0, 1.0)$ で生成した乱数(実数)を返す./**
* @brief Xor-Shift
*
*/
struct XorShift {
private:
constexpr static double R = 1.0 / 0xffffffff;
uint64_t x;
public:
explicit XorShift(uint64_t seed = 88172645463325252ull) : x(seed) {}
template <typename T = uint64_t>
inline T get() { // [0, 2^64)
x ^= x << 7ull;
x ^= x >> 9ull;
return x;
}
inline uint32_t get(uint32_t r) { // [0, r)
return ((uint64_t)get<uint32_t>() * r) >> 32ull;
}
inline uint32_t get(uint32_t l, uint32_t r) { // [l, r)
return l + get(r - l);
}
inline double probability() { // [0.0, 1.0]
return get<uint32_t>() * R;
}
};
#line 1 "other/xor-shift.hpp"
/**
* @brief Xor-Shift
*
*/
struct XorShift {
private:
constexpr static double R = 1.0 / 0xffffffff;
uint64_t x;
public:
explicit XorShift(uint64_t seed = 88172645463325252ull) : x(seed) {}
template <typename T = uint64_t>
inline T get() { // [0, 2^64)
x ^= x << 7ull;
x ^= x >> 9ull;
return x;
}
inline uint32_t get(uint32_t r) { // [0, r)
return ((uint64_t)get<uint32_t>() * r) >> 32ull;
}
inline uint32_t get(uint32_t l, uint32_t r) { // [l, r)
return l + get(r - l);
}
inline double probability() { // [0.0, 1.0]
return get<uint32_t>() * R;
}
};