15 #ifndef INCG_IRIS_IUTEST_RANDOM_HPP_89F260D7_9145_4B50_A8F0_B7A2696121B6_
16 #define INCG_IRIS_IUTEST_RANDOM_HPP_89F260D7_9145_4B50_A8F0_B7A2696121B6_
22 #if IUTEST_HAS_CXX_HDR_RANDOM
37 #if IUTEST_HAS_CXX_HDR_RANDOM && defined(IUTEST_USE_RANDOM_ENGINE_TYPENAME)
43 typedef unsigned int result_type;
49 result_type operator ()()
53 bool operator == (
const Engine& rhs)
55 return m_v1 == rhs.m_v1 && m_v2 == rhs.m_v2 && m_v3 == rhs.m_v3 && m_v4 == rhs.m_v4;
57 bool operator != (
const Engine& rhs)
59 return m_v1 != rhs.m_v1 || m_v2 != rhs.m_v2 || m_v3 != rhs.m_v3 || m_v4 != rhs.m_v4;
62 void seed(
unsigned int s)
65 m_v3 = 1812433253 * ((m_v4 ^ (m_v4 >> 30)) + 1);
66 m_v2 = 1812433253 * ((m_v3 ^ (m_v3 >> 30)) + 2);
67 m_v1 = 1812433253 * ((m_v2 ^ (m_v2 >> 30)) + 3);
69 void discard(
unsigned int z)
71 for(
unsigned int i=0; i < z; ++i)
77 #if !defined(IUTEST_NO_INCLASS_MEMBER_INITIALIZATION)
88 const unsigned int t = (m_v1 ^ (m_v1 << 11));
92 m_v4 = (m_v4 ^ (m_v4 >> 19)) ^ (t ^ (t >> 8));
96 unsigned int m_v1, m_v2, m_v3, m_v4;
103 typedef unsigned int result_type;
108 #if defined(__clang__) && (__clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 3))
119 explicit iuRandom(
unsigned int seed)
131 init(GetIndefiniteValue());
137 void init(
unsigned int seed)
139 m_engine = Engine(seed);
147 result_type genrand()
158 result_type genrand(
unsigned int max)
160 #if IUTEST_HAS_CXX_HDR_RANDOM
161 ::std::uniform_int_distribution<unsigned int> d(0, max-1);
164 return genrand()%max;
177 #if IUTEST_HAS_CXX_HDR_RANDOM
178 ::std::uniform_int_distribution<T> d(0, max-1);
181 #if !defined(IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)
182 return genrand<T>()%max;
184 return genrand(detail::explicit_type<result_type>())%max;
196 #if IUTEST_HAS_CXX_HDR_RANDOM
197 return ::std::uniform_real_distribution<float>(0.0f, 1.0f)(m_engine);
199 return static_cast<float>(genrand())*(1.0f/4294967295.0f);
208 T genrand(IUTEST_EXPLICIT_TEMPLATE_TYPE_(T))
210 return static_cast<T
>(genrand(
static_cast<unsigned int>(
static_cast<T
>(-1) ) ));
213 #if IUTEST_HAS_CLASS_MEMBER_TEMPLATE_SPECIALIZATION && (defined(_MSC_VER) && _MSC_VER < 1300)
214 template<>
float genrand<float>(IUTEST_EXPLICIT_TEMPLATE_TYPE_(
float)) {
return genrandf(); }
215 template<>
double genrand<double>(IUTEST_EXPLICIT_TEMPLATE_TYPE_(
double)) {
return static_cast<double>(genrandf()); }
219 result_type operator ()()
223 result_type operator ()(
unsigned int max)
229 template<
typename It>
230 void shuffle(It first, It last)
232 #if IUTEST_HAS_CXX_HDR_RANDOM
233 ::std::shuffle(first, last, m_engine);
235 ::std::random_shuffle(first, last, *
this);
240 #if !(defined(_MSC_VER) && _MSC_VER < 1300)
242 #define IIUT_WORKAROUND_GENRAND(type) \
243 template<> inline type iuRandom::genrand<type>(IUTEST_EXPLICIT_TEMPLATE_TYPE_(type))
245 IIUT_WORKAROUND_GENRAND(
Int64) {
return (
static_cast<Int64>(genrand()) << 32) | genrand(); }
246 IIUT_WORKAROUND_GENRAND(
UInt64) {
return (
static_cast<UInt64>(genrand()) << 32) | genrand(); }
247 IIUT_WORKAROUND_GENRAND(
float) {
return genrandf(); }
248 IIUT_WORKAROUND_GENRAND(
double) {
return static_cast<double>(genrandf()); }
250 #undef IIUT_WORKAROUND_GENRAND
260 typedef T result_type;
263 explicit iuTypedRandom(
unsigned int seed)
266 result_type operator ()()
271 result_type operator ()(result_type max)
276 result_type genrand()
278 #if !defined(IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)
279 #if defined(__MWERKS__)
280 return m_rnd.template genrand<result_type>();
282 return m_rnd.genrand<result_type>();
285 return m_rnd.genrand(detail::explicit_type<result_type>());
289 result_type genrand(result_type max)
291 return m_rnd.genrand(max);
300 #endif // INCG_IRIS_IUTEST_RANDOM_HPP_89F260D7_9145_4B50_A8F0_B7A2696121B6_