15 #ifndef INCG_IRIS_IUTEST_RANDOM_HPP_89F260D7_9145_4B50_A8F0_B7A2696121B6_
16 #define INCG_IRIS_IUTEST_RANDOM_HPP_89F260D7_9145_4B50_A8F0_B7A2696121B6_
23 #if IUTEST_HAS_CXX_HDR_RANDOM
39 #if IUTEST_HAS_CXX_HDR_RANDOM && defined(IUTEST_USE_RANDOM_ENGINE_TYPENAME)
45 typedef unsigned int result_type;
51 result_type operator ()()
55 bool operator == (
const Engine& rhs)
57 return m_v1 == rhs.m_v1 && m_v2 == rhs.m_v2 && m_v3 == rhs.m_v3 && m_v4 == rhs.m_v4;
59 bool operator != (
const Engine& rhs)
61 return m_v1 != rhs.m_v1 || m_v2 != rhs.m_v2 || m_v3 != rhs.m_v3 || m_v4 != rhs.m_v4;
64 void seed(
unsigned int s)
67 m_v3 = 1812433253 * ((m_v4 ^ (m_v4 >> 30)) + 1);
68 m_v2 = 1812433253 * ((m_v3 ^ (m_v3 >> 30)) + 2);
69 m_v1 = 1812433253 * ((m_v2 ^ (m_v2 >> 30)) + 3);
71 void discard(
unsigned int z)
73 for(
unsigned int i=0; i < z; ++i)
79 #if !defined(IUTEST_NO_INCLASS_MEMBER_INITIALIZATION)
90 const unsigned int t = (m_v1 ^ (m_v1 << 11));
94 m_v4 = (m_v4 ^ (m_v4 >> 19)) ^ (t ^ (t >> 8));
98 unsigned int m_v1, m_v2, m_v3, m_v4;
105 typedef unsigned int result_type;
110 #if defined(__clang__) && (IUTEST_CLANG_MAJOR < 3 || (IUTEST_CLANG_MAJOR == 3 && IUTEST_CLANG_MINOR < 3))
121 explicit iuRandom(
unsigned int seed)
133 init(GetIndefiniteValue());
139 void init(
unsigned int seed)
141 m_engine = Engine(seed);
149 result_type genrand()
160 result_type genrand(
unsigned int max)
162 #if IUTEST_HAS_CXX_HDR_RANDOM
163 ::std::uniform_int_distribution<unsigned int> d(0, max-1);
166 return genrand()%max;
179 #if IUTEST_HAS_CXX_HDR_RANDOM
180 ::std::uniform_int_distribution<T> d(0, max-1);
183 #if !defined(IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)
184 return genrand<T>()%max;
186 return genrand(detail::explicit_type<result_type>())%max;
198 #if IUTEST_HAS_CXX_HDR_RANDOM
199 return ::std::uniform_real_distribution<float>(0.0f, 1.0f)(m_engine);
201 return static_cast<float>(genrand())*(1.0f/4294967295.0f);
210 T genrand(IUTEST_EXPLICIT_TEMPLATE_TYPE_(T))
212 return static_cast<T
>(genrand(
static_cast<unsigned int>(
static_cast<T
>(-1) ) ));
215 #if IUTEST_HAS_CLASS_MEMBER_TEMPLATE_SPECIALIZATION && (defined(_MSC_VER) && _MSC_VER < 1300)
216 template<>
float genrand<float>(IUTEST_EXPLICIT_TEMPLATE_TYPE_(
float)) {
return genrandf(); }
217 template<>
double genrand<double>(IUTEST_EXPLICIT_TEMPLATE_TYPE_(
double)) {
return static_cast<double>(genrandf()); }
221 result_type operator ()()
225 result_type operator ()(
unsigned int max)
231 template<
typename It>
232 void shuffle(It first, It last)
234 #if IUTEST_HAS_CXX_HDR_RANDOM
235 ::std::shuffle(first, last, m_engine);
237 ::std::random_shuffle(first, last, *
this);
242 #if !(defined(_MSC_VER) && _MSC_VER < 1300)
244 #define IIUT_WORKAROUND_GENRAND(type) \
245 template<> inline type iuRandom::genrand<type>(IUTEST_EXPLICIT_TEMPLATE_TYPE_(type))
247 IIUT_WORKAROUND_GENRAND(
Int64) {
return (
static_cast<Int64>(genrand()) << 32) | genrand(); }
248 IIUT_WORKAROUND_GENRAND(
UInt64) {
return (
static_cast<UInt64>(genrand()) << 32) | genrand(); }
249 IIUT_WORKAROUND_GENRAND(
float) {
return genrandf(); }
250 IIUT_WORKAROUND_GENRAND(
double) {
return static_cast<double>(genrandf()); }
252 #undef IIUT_WORKAROUND_GENRAND
262 typedef T result_type;
265 explicit iuTypedRandom(
unsigned int seed)
268 result_type operator ()()
273 result_type operator ()(result_type max)
278 result_type genrand()
280 #if !defined(IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)
281 #if defined(__MWERKS__)
282 return m_rnd.template genrand<result_type>();
284 return m_rnd.genrand<result_type>();
287 return m_rnd.genrand(detail::explicit_type<result_type>());
291 result_type genrand(result_type max)
293 return m_rnd.genrand(max);
#define IUTEST_USE_RANDOM_ENGINE_TYPENAME
iutest で使用する乱数エンジンを指定します
Definition: iutest_config.hpp:782
#define IUTEST_CXX_CONSTEXPR_OR_CONST
constexpr or const
Definition: iutest_compiler.hpp:386
#define IUTEST_CXX_CONSTEXPR
constexpr
Definition: iutest_compiler.hpp:372
#define IUTEST_CXX_NOEXCEPT_SPEC
noexcept specification definition
Definition: iutest_compiler.hpp:811
iutest root namespace
Definition: iutest_charcode.hpp:33
detail::type_fit_t< 8 >::UInt UInt64
64 bit 符号なし整数型
Definition: iutest_defs.hpp:505
detail::type_fit_t< 8 >::Int Int64
64 bit 符号付き整数型
Definition: iutest_defs.hpp:504