test_generate_canonical.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /* test_generate_canonical.cpp
  2. *
  3. * Copyright Steven Watanabe 2011
  4. * Distributed under the Boost Software License, Version 1.0. (See
  5. * accompanying file LICENSE_1_0.txt or copy at
  6. * http://www.boost.org/LICENSE_1_0.txt)
  7. *
  8. * $Id$
  9. *
  10. */
  11. #include <boost/random/generate_canonical.hpp>
  12. #include <boost/random/linear_congruential.hpp>
  13. #include <boost/random/mersenne_twister.hpp>
  14. #include <boost/random/lagged_fibonacci.hpp>
  15. #include <boost/cstdint.hpp>
  16. #include <boost/mpl/vector.hpp>
  17. #define BOOST_TEST_MAIN
  18. #include <boost/test/unit_test.hpp>
  19. typedef boost::mpl::vector<
  20. boost::random::minstd_rand,
  21. boost::random::mt19937,
  22. boost::random::lagged_fibonacci607
  23. > engines;
  24. BOOST_AUTO_TEST_CASE_TEMPLATE(test_float, Engine, engines)
  25. {
  26. Engine eng;
  27. Engine expected;
  28. for(int i = 0; i < 1000; ++i) {
  29. float val = boost::random::generate_canonical<float, 64>(eng);
  30. BOOST_CHECK_GE(val, 0);
  31. BOOST_CHECK_LT(val, 1);
  32. }
  33. expected.discard(1000);
  34. BOOST_CHECK_EQUAL(eng, expected);
  35. for(int i = 0; i < 1000; ++i) {
  36. float val = boost::random::generate_canonical<float, 12>(eng);
  37. BOOST_CHECK_GE(val, 0);
  38. BOOST_CHECK_LT(val, 1);
  39. }
  40. expected.discard(1000);
  41. BOOST_CHECK_EQUAL(eng, expected);
  42. }
  43. BOOST_AUTO_TEST_CASE_TEMPLATE(test_double, Engine, engines)
  44. {
  45. Engine eng;
  46. Engine expected;
  47. for(int i = 0; i < 1000; ++i) {
  48. double val = boost::random::generate_canonical<double, 64>(eng);
  49. BOOST_CHECK_GE(val, 0);
  50. BOOST_CHECK_LT(val, 1);
  51. }
  52. expected.discard(2000);
  53. BOOST_CHECK_EQUAL(eng, expected);
  54. for(int i = 0; i < 1000; ++i) {
  55. double val = boost::random::generate_canonical<double, 12>(eng);
  56. BOOST_CHECK_GE(val, 0);
  57. BOOST_CHECK_LT(val, 1);
  58. }
  59. expected.discard(1000);
  60. BOOST_CHECK_EQUAL(eng, expected);
  61. }
  62. BOOST_AUTO_TEST_CASE_TEMPLATE(test_long_double, Engine, engines)
  63. {
  64. Engine eng;
  65. Engine expected;
  66. for(int i = 0; i < 1000; ++i) {
  67. long double val = boost::random::generate_canonical<long double, 60>(eng);
  68. BOOST_CHECK_GE(val, 0);
  69. BOOST_CHECK_LT(val, 1);
  70. }
  71. expected.discard(2000);
  72. BOOST_CHECK_EQUAL(eng, expected);
  73. for(int i = 0; i < 1000; ++i) {
  74. long double val = boost::random::generate_canonical<long double, 12>(eng);
  75. BOOST_CHECK_GE(val, 0);
  76. BOOST_CHECK_LT(val, 1);
  77. }
  78. expected.discard(1000);
  79. BOOST_CHECK_EQUAL(eng, expected);
  80. }
  81. struct max_engine
  82. {
  83. typedef boost::uint32_t result_type;
  84. static result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () { return 0; }
  85. static result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
  86. { return ~boost::uint32_t(0); }
  87. result_type operator()() { return (max)(); }
  88. };
  89. BOOST_AUTO_TEST_CASE(test_max)
  90. {
  91. max_engine eng;
  92. BOOST_CHECK_LT((boost::random::generate_canonical<float, 64>(eng)), 1);
  93. BOOST_CHECK_LT((boost::random::generate_canonical<double, 64>(eng)), 1);
  94. BOOST_CHECK_LT((boost::random::generate_canonical<long double, 64>(eng)), 1);
  95. }