rand.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // This file is part of Eigen, a lightweight C++ template library
  2. // for linear algebra.
  3. //
  4. // Copyright (C) 2015 Gael Guennebaud <gael.guennebaud@inria.fr>
  5. //
  6. // This Source Code Form is subject to the terms of the Mozilla
  7. // Public License v. 2.0. If a copy of the MPL was not distributed
  8. // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
  9. #include "main.h"
  10. typedef long long int64;
  11. template<typename Scalar> Scalar check_in_range(Scalar x, Scalar y)
  12. {
  13. Scalar r = internal::random<Scalar>(x,y);
  14. VERIFY(r>=x);
  15. if(y>=x)
  16. {
  17. VERIFY(r<=y);
  18. }
  19. return r;
  20. }
  21. template<typename Scalar> void check_all_in_range(Scalar x, Scalar y)
  22. {
  23. Array<int,1,Dynamic> mask(y-x+1);
  24. mask.fill(0);
  25. long n = (y-x+1)*32;
  26. for(long k=0; k<n; ++k)
  27. {
  28. mask( check_in_range(x,y)-x )++;
  29. }
  30. for(Index i=0; i<mask.size(); ++i)
  31. if(mask(i)==0)
  32. std::cout << "WARNING: value " << x+i << " not reached." << std::endl;
  33. VERIFY( (mask>0).all() );
  34. }
  35. template<typename Scalar> void check_histogram(Scalar x, Scalar y, int bins)
  36. {
  37. Array<int,1,Dynamic> hist(bins);
  38. hist.fill(0);
  39. int f = 100000;
  40. int n = bins*f;
  41. int64 range = int64(y)-int64(x);
  42. int divisor = int((range+1)/bins);
  43. assert(((range+1)%bins)==0);
  44. for(int k=0; k<n; ++k)
  45. {
  46. Scalar r = check_in_range(x,y);
  47. hist( int((int64(r)-int64(x))/divisor) )++;
  48. }
  49. VERIFY( (((hist.cast<double>()/double(f))-1.0).abs()<0.02).all() );
  50. }
  51. void test_rand()
  52. {
  53. long long_ref = NumTraits<long>::highest()/10;
  54. signed char char_offset = (std::min)(g_repeat,64);
  55. signed char short_offset = (std::min)(g_repeat,16000);
  56. for(int i = 0; i < g_repeat*10000; i++) {
  57. CALL_SUBTEST(check_in_range<float>(10,11));
  58. CALL_SUBTEST(check_in_range<float>(1.24234523,1.24234523));
  59. CALL_SUBTEST(check_in_range<float>(-1,1));
  60. CALL_SUBTEST(check_in_range<float>(-1432.2352,-1432.2352));
  61. CALL_SUBTEST(check_in_range<double>(10,11));
  62. CALL_SUBTEST(check_in_range<double>(1.24234523,1.24234523));
  63. CALL_SUBTEST(check_in_range<double>(-1,1));
  64. CALL_SUBTEST(check_in_range<double>(-1432.2352,-1432.2352));
  65. CALL_SUBTEST(check_in_range<int>(0,-1));
  66. CALL_SUBTEST(check_in_range<short>(0,-1));
  67. CALL_SUBTEST(check_in_range<long>(0,-1));
  68. CALL_SUBTEST(check_in_range<int>(-673456,673456));
  69. CALL_SUBTEST(check_in_range<int>(-RAND_MAX+10,RAND_MAX-10));
  70. CALL_SUBTEST(check_in_range<short>(-24345,24345));
  71. CALL_SUBTEST(check_in_range<long>(-long_ref,long_ref));
  72. }
  73. CALL_SUBTEST(check_all_in_range<signed char>(11,11));
  74. CALL_SUBTEST(check_all_in_range<signed char>(11,11+char_offset));
  75. CALL_SUBTEST(check_all_in_range<signed char>(-5,5));
  76. CALL_SUBTEST(check_all_in_range<signed char>(-11-char_offset,-11));
  77. CALL_SUBTEST(check_all_in_range<signed char>(-126,-126+char_offset));
  78. CALL_SUBTEST(check_all_in_range<signed char>(126-char_offset,126));
  79. CALL_SUBTEST(check_all_in_range<signed char>(-126,126));
  80. CALL_SUBTEST(check_all_in_range<short>(11,11));
  81. CALL_SUBTEST(check_all_in_range<short>(11,11+short_offset));
  82. CALL_SUBTEST(check_all_in_range<short>(-5,5));
  83. CALL_SUBTEST(check_all_in_range<short>(-11-short_offset,-11));
  84. CALL_SUBTEST(check_all_in_range<short>(-24345,-24345+short_offset));
  85. CALL_SUBTEST(check_all_in_range<short>(24345,24345+short_offset));
  86. CALL_SUBTEST(check_all_in_range<int>(11,11));
  87. CALL_SUBTEST(check_all_in_range<int>(11,11+g_repeat));
  88. CALL_SUBTEST(check_all_in_range<int>(-5,5));
  89. CALL_SUBTEST(check_all_in_range<int>(-11-g_repeat,-11));
  90. CALL_SUBTEST(check_all_in_range<int>(-673456,-673456+g_repeat));
  91. CALL_SUBTEST(check_all_in_range<int>(673456,673456+g_repeat));
  92. CALL_SUBTEST(check_all_in_range<long>(11,11));
  93. CALL_SUBTEST(check_all_in_range<long>(11,11+g_repeat));
  94. CALL_SUBTEST(check_all_in_range<long>(-5,5));
  95. CALL_SUBTEST(check_all_in_range<long>(-11-g_repeat,-11));
  96. CALL_SUBTEST(check_all_in_range<long>(-long_ref,-long_ref+g_repeat));
  97. CALL_SUBTEST(check_all_in_range<long>( long_ref, long_ref+g_repeat));
  98. CALL_SUBTEST(check_histogram<int>(-5,5,11));
  99. int bins = 100;
  100. CALL_SUBTEST(check_histogram<int>(-3333,-3333+bins*(3333/bins)-1,bins));
  101. bins = 1000;
  102. CALL_SUBTEST(check_histogram<int>(-RAND_MAX+10,-RAND_MAX+10+bins*(RAND_MAX/bins)-1,bins));
  103. CALL_SUBTEST(check_histogram<int>(-RAND_MAX+10,-int64(RAND_MAX)+10+bins*(2*int64(RAND_MAX)/bins)-1,bins));
  104. }