Luzhiled's Library

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub ei1333/library

:warning: Xor Shift (other/xor-shift.hpp)

Xorshift は擬似乱数生成法の一つである。

周期が $2^{64}-1$ となる実装を示した。

コンストラクタ

explicit XorShift(uint64_t seed = 88172645463325252ull)

シード値 seed で初期化する。

get

inline T get()

$[0, 2^{64})$ で生成した乱数を返す。

get

inline uint32_t get(uint32_t r)

$[0, r)$ で生成した乱数を返す。r は32bit整数に限る。64bitで生成したい場合は例えば get() を r で割った余りを求めるとよい。

get

inline uint32_t get(uint32_t l, uint32_t r)

$[l, r)$ で生成した乱数を返す。

probability

inline double probability()

$[0.0, 1.0)$ で生成した乱数(実数)を返す。

Code

#pragma once

#include <cstdint>

/**
 * @brief Xor-Shift
 *
 */
struct XorShift {
 private:
  constexpr static double R = 1.0 / 0xffffffff;
  std::uint64_t x;

 public:
  explicit XorShift(std::uint64_t seed = 88172645463325252ull) : x(seed) {}

  template <typename T = std::uint64_t>
  inline T get() {  // [0, 2^64)
    x ^= x << 7ull;
    x ^= x >> 9ull;
    return x;
  }

  inline std::uint32_t get(std::uint32_t r) {  // [0, r)
    return ((std::uint64_t)get<std::uint32_t>() * r) >> 32ull;
  }

  inline std::uint32_t get(std::uint32_t l, std::uint32_t r) {  // [l, r)
    return l + get(r - l);
  }

  inline double probability() {  // [0.0, 1.0]
    return get<std::uint32_t>() * R;
  }
};
#line 2 "other/xor-shift.hpp"

#include <cstdint>

/**
 * @brief Xor-Shift
 *
 */
struct XorShift {
 private:
  constexpr static double R = 1.0 / 0xffffffff;
  std::uint64_t x;

 public:
  explicit XorShift(std::uint64_t seed = 88172645463325252ull) : x(seed) {}

  template <typename T = std::uint64_t>
  inline T get() {  // [0, 2^64)
    x ^= x << 7ull;
    x ^= x >> 9ull;
    return x;
  }

  inline std::uint32_t get(std::uint32_t r) {  // [0, r)
    return ((std::uint64_t)get<std::uint32_t>() * r) >> 32ull;
  }

  inline std::uint32_t get(std::uint32_t l, std::uint32_t r) {  // [l, r)
    return l + get(r - l);
  }

  inline double probability() {  // [0.0, 1.0]
    return get<std::uint32_t>() * R;
  }
};
Back to top page