2
0
mirror of https://github.com/boostorg/random.git synced 2026-01-19 16:32:16 +00:00
Files
random/test/validate.cpp
Steven Watanabe fc5e34a947 Start refactoring tests again.
[SVN r67761]
2011-01-07 18:48:53 +00:00

87 lines
2.9 KiB
C++

/* boost validate.cpp
*
* Copyright Jens Maurer 2000
* Copyright Steven Watanabe 2010-2011
* Distributed under the Boost Software License, Version 1.0. (See
* accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*
* $Id$
*/
#include <cmath>
#include <boost/random.hpp>
#include <boost/config.hpp>
#include <boost/test/test_tools.hpp>
#include <boost/test/included/test_exec_monitor.hpp>
/*
* Validate correct implementation
*/
template<class PRNG>
typename PRNG::result_type validation_value(PRNG rng)
{
for(int i = 0; i < 9999; i++)
rng();
return rng();
}
int test_main(int, char*[])
{
// own run
BOOST_CHECK_EQUAL(validation_value(boost::mt11213b()), 3809585648U);
// validation by experiment from mt19937.c
BOOST_CHECK_EQUAL(validation_value(boost::mt19937()), 4123659995U);
#if !defined(BOOST_NO_INT64_T) && !defined(BOOST_NO_INTEGRAL_INT64_T)
// validation from the C++0x draft (n3090)
BOOST_CHECK_EQUAL(validation_value(boost::mt19937_64()), UINT64_C(9981545732273789042));
#endif
// validation values from the publications
BOOST_CHECK_EQUAL(validation_value(boost::minstd_rand0()), 1043618065);
// validation values from the publications
BOOST_CHECK_EQUAL(validation_value(boost::minstd_rand()), 399268537);
#if !defined(BOOST_NO_INT64_T) && !defined(BOOST_NO_INTEGRAL_INT64_T)
// by experiment from lrand48()
BOOST_CHECK_EQUAL(validation_value(boost::rand48()), 1993516219);
#endif
// ????
BOOST_CHECK_EQUAL(validation_value(boost::taus88()), 3535848941U);
// ????
BOOST_CHECK_EQUAL(validation_value(boost::ecuyer1988()), 2060321752);
// validation by experiment from Harry Erwin's generator.h (private e-mail)
BOOST_CHECK_EQUAL(validation_value(boost::kreutzer1986()), 139726);
// validation from the C++0x draft (n3090)
BOOST_CHECK_EQUAL(validation_value(boost::random::knuth_b()), 1112339016);
BOOST_CHECK_CLOSE_FRACTION(validation_value(boost::lagged_fibonacci607()), 0.401269, 1e-5);
// principal operation validated with CLHEP, values by experiment
BOOST_CHECK_EQUAL(validation_value(boost::ranlux3()), 5957620);
BOOST_CHECK_EQUAL(validation_value(boost::ranlux4()), 8587295);
BOOST_CHECK_CLOSE_FRACTION(validation_value(boost::ranlux3_01()), 5957620/std::pow(2.0f,24), 1e-6);
BOOST_CHECK_CLOSE_FRACTION(validation_value(boost::ranlux4_01()), 8587295/std::pow(2.0f,24), 1e-6);
BOOST_CHECK_CLOSE_FRACTION(validation_value(boost::ranlux64_3_01()), 0.838413, 1e-6);
BOOST_CHECK_CLOSE_FRACTION(validation_value(boost::ranlux64_4_01()), 0.59839, 1e-6);
BOOST_CHECK_EQUAL(validation_value(boost::random::ranlux24()), 9901578);
#if !defined(BOOST_NO_INT64_T) && !defined(BOOST_NO_INTEGRAL_INT64_T)
BOOST_CHECK_EQUAL(validation_value(boost::random::ranlux48()), UINT64_C(249142670248501));
#endif
return 0;
}