1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <random> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class UIntType, size_t w, size_t n, size_t m, size_t r, 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// UIntType a, size_t u, UIntType d, size_t s, 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// UIntType b, size_t t, UIntType c, size_t l, UIntType f> 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// class mersenne_twister_engine 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// { 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// public: 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// // types 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// typedef UIntType result_type; 200e20cae1a5be18fba591cd884aa2a389b66a3f49Howard Hinnant// 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// // engine characteristics 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr size_t word_size = w; 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr size_t state_size = n; 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr size_t shift_size = m; 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr size_t mask_bits = r; 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr result_type xor_mask = a; 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr size_t tempering_u = u; 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr result_type tempering_d = d; 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr size_t tempering_s = s; 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr result_type tempering_b = b; 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr size_t tempering_t = t; 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr result_type tempering_c = c; 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr size_t tempering_l = l; 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr result_type initialization_multiplier = f; 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr result_type min () { return 0; } 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr result_type max() { return 2^w - 1; } 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// static constexpr result_type default_seed = 5489u; 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <random> 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <type_traits> 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 430a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnanttemplate <class _Tp> 440a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantvoid where(const _Tp &) {} 450a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest1() 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::mt19937 E; 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::word_size == 32), ""); 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::state_size == 624), ""); 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::shift_size == 397), ""); 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::mask_bits == 31), ""); 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::xor_mask == 0x9908b0df), ""); 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_u == 11), ""); 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_d == 0xffffffff), ""); 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_s == 7), ""); 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_b == 0x9d2c5680), ""); 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_t == 15), ""); 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_c == 0xefc60000), ""); 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_l == 18), ""); 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::initialization_multiplier == 1812433253), ""); 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant /*static_*/assert((E::min() == 0)/*, ""*/); 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant /*static_*/assert((E::max() == 0xFFFFFFFF)/*, ""*/); 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::default_seed == 5489u), ""); 660a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::word_size); 670a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::state_size); 680a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::shift_size); 690a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::mask_bits); 700a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::xor_mask); 710a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_u); 720a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_d); 730a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_s); 740a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_b); 750a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_t); 760a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_c); 770a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_l); 780a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::initialization_multiplier); 790a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::default_seed); 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest2() 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::mt19937_64 E; 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::word_size == 64), ""); 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::state_size == 312), ""); 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::shift_size == 156), ""); 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::mask_bits == 31), ""); 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::xor_mask == 0xb5026f5aa96619e9ull), ""); 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_u == 29), ""); 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_d == 0x5555555555555555ull), ""); 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_s == 17), ""); 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_b == 0x71d67fffeda60000ull), ""); 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_t == 37), ""); 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_c == 0xfff7eee000000000ull), ""); 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::tempering_l == 43), ""); 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::initialization_multiplier == 6364136223846793005ull), ""); 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant /*static_*/assert((E::min() == 0)/*, ""*/); 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant /*static_*/assert((E::max() == 0xFFFFFFFFFFFFFFFFull)/*, ""*/); 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((E::default_seed == 5489u), ""); 1020a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::word_size); 1030a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::state_size); 1040a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::shift_size); 1050a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::mask_bits); 1060a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::xor_mask); 1070a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_u); 1080a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_d); 1090a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_s); 1100a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_b); 1110a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_t); 1120a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_c); 1130a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::tempering_l); 1140a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::initialization_multiplier); 1150a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant where(E::default_seed); 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test1(); 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test2(); 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 123