疑似乱数生成器 SplitMix64
lib/random/split_mix64.hpp
概要
64 bit 整数を高速に生成する SplitMix64。単体の疑似乱数生成器として利用できるほか、 他の乱数生成器へ状態列を供給するシード生成器としても利用できる。
インクルード
#include "random/split_mix64.hpp"
クラス
| 名前 | 説明 |
|---|---|
SplitMix64 |
疑似乱数生成器 SplitMix64 |
依存するヘッダ(1)
-
疑似乱数生成器の共通部分(CRTP)
lib/internal/internal_random.hpp
このヘッダを使うライブラリ(8)
-
要素の挿入・削除が可能な動的ウェーブレット行列
lib/data_structure/dynamic_wavelet_matrix.hpp -
動的完備辞書
lib/internal/dynamic_bit_vector.hpp -
素因数分解
lib/number_theory/factorize.hpp -
素数列挙・判定
lib/number_theory/prime_number.hpp -
疑似乱数生成器 xoroshiro128++
lib/random/xoroshiro128.hpp -
疑似乱数生成器 xorshift128
lib/random/xorshift128.hpp -
疑似乱数生成器 xoshiro128++
lib/random/xoshiro128.hpp -
Zobrist ハッシュ
lib/random/zobrist_hash.hpp
検証プログラム(12)
-
test/aoj/challenge/0009.test.cpp
test/aoj/challenge/0009.test.cpp -
test/aoj/challenge/1276.test.cpp
test/aoj/challenge/1276.test.cpp -
test/aoj/course/ALDS1_1_C.test.cpp
test/aoj/course/ALDS1_1_C.test.cpp -
test/aoj/ntl/prime_factorize.test.cpp
test/aoj/ntl/prime_factorize.test.cpp -
test/yosupo/convolution/gcd_convolution.test.cpp
test/yosupo/convolution/gcd_convolution.test.cpp -
test/yosupo/convolution/lcm_convolution.test.cpp
test/yosupo/convolution/lcm_convolution.test.cpp -
test/yosupo/data_structure/point_set_range_frequency.test.cpp
test/yosupo/data_structure/point_set_range_frequency.test.cpp -
test/yosupo/number_theory/factorize.test.cpp
test/yosupo/number_theory/factorize.test.cpp -
test/yosupo/number_theory/primitive_root.test.cpp
test/yosupo/number_theory/primitive_root.test.cpp -
test/yosupo/tree/rooted_tree_isomorphism_classification.test.cpp
test/yosupo/tree/rooted_tree_isomorphism_classification.test.cpp -
test/yukicoder/0843.test.cpp
test/yukicoder/0843.test.cpp -
test/yukicoder/1611.test.cpp
test/yukicoder/1611.test.cpp
実装
#pragma once
#include <array>
#include <cstddef>
#include <cstdint>
#include "internal/internal_random.hpp"
/// @file
/// @brief 疑似乱数生成器 SplitMix64
/// @details 64 bit 整数を高速に生成する SplitMix64。単体の疑似乱数生成器として利用できるほか、
/// 他の乱数生成器へ状態列を供給するシード生成器としても利用できる。
/// @brief 疑似乱数生成器 SplitMix64
/// @details 周期:$2^{64}$
/// @complexity すべての操作が $O(1)$、長さNのseed列生成は $O(N)$
struct SplitMix64 : internal::RandomEngineBase<SplitMix64, std::uint64_t, std::uint64_t> {
/// @brief 既定seedで構築する
/// @complexity $O(1)$
constexpr SplitMix64() noexcept : RandomEngineBase(1234567890) {}
/// @brief 指定seedで構築する
/// @complexity $O(1)$
constexpr SplitMix64(std::uint64_t seed) noexcept : RandomEngineBase(seed) {}
/// @brief 次の64bit乱数を返す
/// @complexity $O(1)$
constexpr result_type operator()() noexcept {
std::uint64_t z = (state += 0x9e3779b97f4a7c15);
z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
return z ^ (z >> 31);
}
/// @brief N個の64bit seedを生成する
/// @complexity $O(N)$
template <std::size_t N>
constexpr std::array<std::uint64_t, N> generate_seed_sequence() noexcept {
std::array<std::uint64_t, N> seeds = {};
for (auto &seed : seeds) seed = operator()();
return seeds;
}
};