test_seed_seq.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /* boost test_seed_seq.cpp
  2. *
  3. * Copyright Steven Watanabe 2010
  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. #include <boost/random/seed_seq.hpp>
  11. #include <boost/assign/list_of.hpp>
  12. #include <boost/config.hpp>
  13. #include <vector>
  14. #define BOOST_TEST_MAIN
  15. #include <boost/test/unit_test.hpp>
  16. using boost::assign::list_of;
  17. BOOST_AUTO_TEST_CASE(test_seed_seq) {
  18. boost::uint32_t expected_param[4] = { 2, 3, 4, 0xdeadbeaf };
  19. boost::uint32_t param[4] = { 2, 3, 4, 0xdeadbeaf };
  20. boost::uint32_t store32[10];
  21. boost::uint64_t store64[10];
  22. boost::uint32_t expected[10] = {
  23. 3155793538u,
  24. 2047427591u,
  25. 2886057794u,
  26. 280666868u,
  27. 2184015838u,
  28. 4035763234u,
  29. 808987374u,
  30. 3177165994u,
  31. 2993445429u,
  32. 3110180644u
  33. };
  34. std::fill_n(&store32[0], 10, 0);
  35. std::fill_n(&store64[0], 10, 0);
  36. boost::random::seed_seq seq;
  37. seq.generate(&store32[0], &store32[0] + 10);
  38. BOOST_CHECK_EQUAL_COLLECTIONS(
  39. &store32[0], &store32[0] + 10, &expected[0], &expected[0] + 10);
  40. seq.generate(&store64[0], &store64[0] + 10);
  41. BOOST_CHECK_EQUAL_COLLECTIONS(
  42. &store64[0], &store64[0] + 10, &expected[0], &expected[0] + 10);
  43. BOOST_CHECK_EQUAL(seq.size(), 0u);
  44. seq.param(&param[0]);
  45. BOOST_CHECK_EQUAL_COLLECTIONS(
  46. &param[0], &param[0] + 4, &expected_param[0], &expected_param[0] + 4);
  47. boost::uint32_t expected_r[10] = {
  48. 2681148375u,
  49. 3302224839u,
  50. 249244011u,
  51. 1549723892u,
  52. 3429166360u,
  53. 2812310274u,
  54. 3902694127u,
  55. 1014283089u,
  56. 1122383019u,
  57. 494552679u
  58. };
  59. std::vector<int> data = list_of(2)(3)(4);
  60. std::fill_n(&store32[0], 10, 0);
  61. std::fill_n(&store64[0], 10, 0);
  62. std::fill_n(&param[0], 3, 0);
  63. boost::random::seed_seq seq_r(data);
  64. seq_r.generate(&store32[0], &store32[0] + 10);
  65. BOOST_CHECK_EQUAL_COLLECTIONS(
  66. &store32[0], &store32[0] + 10, &expected_r[0], &expected_r[0] + 10);
  67. seq_r.generate(&store64[0], &store64[0] + 10);
  68. BOOST_CHECK_EQUAL_COLLECTIONS(
  69. &store64[0], &store64[0] + 10, &expected_r[0], &expected_r[0] + 10);
  70. BOOST_CHECK_EQUAL(seq_r.size(), 3u);
  71. seq_r.param(&param[0]);
  72. BOOST_CHECK_EQUAL_COLLECTIONS(
  73. &param[0], &param[0] + 4, &expected_param[0], &expected_param[0] + 4);
  74. std::fill_n(&store32[0], 10, 0);
  75. std::fill_n(&store64[0], 10, 0);
  76. std::fill_n(&param[0], 3, 0);
  77. boost::random::seed_seq seq_it(data.begin(), data.end());
  78. seq_it.generate(&store32[0], &store32[0] + 10);
  79. BOOST_CHECK_EQUAL_COLLECTIONS(
  80. &store32[0], &store32[0] + 10, &expected_r[0], &expected_r[0] + 10);
  81. seq_it.generate(&store64[0], &store64[0] + 10);
  82. BOOST_CHECK_EQUAL_COLLECTIONS(
  83. &store64[0], &store64[0] + 10, &expected_r[0], &expected_r[0] + 10);
  84. BOOST_CHECK_EQUAL(seq_it.size(), 3u);
  85. seq_it.param(&param[0]);
  86. BOOST_CHECK_EQUAL_COLLECTIONS(
  87. &param[0], &param[0] + 4, &expected_param[0], &expected_param[0] + 4);
  88. #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
  89. std::fill_n(&store32[0], 10, 0);
  90. std::fill_n(&store64[0], 10, 0);
  91. std::fill_n(&param[0], 3, 0);
  92. boost::random::seed_seq seq_il = {2, 3, 4};
  93. seq_il.generate(&store32[0], &store32[0] + 10);
  94. BOOST_CHECK_EQUAL_COLLECTIONS(
  95. &store32[0], &store32[0] + 10, &expected_r[0], &expected_r[0] + 10);
  96. seq_il.generate(&store64[0], &store64[0] + 10);
  97. BOOST_CHECK_EQUAL_COLLECTIONS(
  98. &store64[0], &store64[0] + 10, &expected_r[0], &expected_r[0] + 10);
  99. BOOST_CHECK_EQUAL(seq_il.size(), 3u);
  100. seq_il.param(&param[0]);
  101. BOOST_CHECK_EQUAL_COLLECTIONS(
  102. &param[0], &param[0] + 4, &expected_param[0], &expected_param[0] + 4);
  103. #endif
  104. }
  105. BOOST_AUTO_TEST_CASE(test_seed_seq_short_output) {
  106. boost::uint32_t store32[2];
  107. boost::uint32_t expected_short[2] = {
  108. 4149590228u,
  109. 3175758659u
  110. };
  111. std::vector<int> data = list_of(2)(3)(4)(5);
  112. boost::random::seed_seq seq(data);
  113. seq.generate(&store32[0], &store32[0] + 2);
  114. BOOST_CHECK_EQUAL_COLLECTIONS(
  115. &store32[0], &store32[0] + 2, &expected_short[0], &expected_short[0] + 2);
  116. }