Advertisement
Guest User

Untitled

a guest
Apr 6th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.45 KB | None | 0 0
  1. #include <random>
  2. #include <iostream>
  3. #include <chrono>
  4.  
  5. #if RAND_MAX < 65536
  6. static const size_t XRAND_MAX = (RAND_MAX + 1) * (RAND_MAX + 1) - 1;
  7. static size_t xrand()
  8. {
  9. return rand() * (RAND_MAX + 1) + rand();
  10. }
  11. // rand() is already ok; no need to do anything.
  12. #else
  13. static const size_t XRAND_MAX = RAND_MAX;
  14. static size_t xrand()
  15. {
  16. return rand();
  17. }
  18. #endif
  19.  
  20. size_t rand(size_t min_inclusive, size_t max_exclusive)
  21. {
  22. const size_t range = (max_exclusive - min_inclusive);
  23. // huge interval or min >= max
  24. if (range == 0 || range > XRAND_MAX)
  25. {
  26. std::cout << "x < ERR::INVALID_PARAM" << std::endl;
  27. return 0;
  28. }
  29.  
  30. const size_t inv_range = XRAND_MAX / range;
  31.  
  32. // generate random number in [0, range)
  33. // idea: avoid skewed distributions when <range> doesn't evenly divide
  34. // XRAND_MAX by simply discarding values in the "remainder".
  35. // not expected to run often since XRAND_MAX is large.
  36. size_t x;
  37. do
  38. {
  39. x = xrand();
  40. } while (x >= range * inv_range);
  41. x /= inv_range;
  42.  
  43. x += min_inclusive;
  44. // if (x < max_exclusive)
  45. // std::cout << "x < max_exclusive" << std::endl;
  46. return x;
  47. }
  48.  
  49. static float RandFloat(float min, float max)
  50. {
  51. return rand(min * 100.f, max * 100.f) / 100.f;
  52. }
  53.  
  54. static float RandFloat(std::mt19937 &rng, float min, float max)
  55. {
  56. return std::uniform_real_distribution<float>(min, max)(rng);
  57. }
  58.  
  59. int main()
  60. {
  61.  
  62. int samples = 1000000;
  63.  
  64. auto begin = std::chrono::high_resolution_clock::now();
  65. float value;
  66.  
  67. for (int i = 0; i < samples; ++i)
  68. {
  69. value = RandFloat(0.f, 1.f);
  70. }
  71. auto end = std::chrono::high_resolution_clock::now();
  72. std::cout << "RandFloat(float min, float max): " << value;
  73. std::cout << "RandFloat(float min, float max): " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << "ns" << std::endl;
  74.  
  75. begin = std::chrono::high_resolution_clock::now();
  76. for (int i = 0; i < samples; ++i)
  77. {
  78. std::mt19937 rng;
  79. rng.seed(i);
  80. value = RandFloat(rng, 0.f, 1.f);
  81. }
  82. end = std::chrono::high_resolution_clock::now();
  83. std::cout << "RandFloat(std::mt19937& rng, float min, float max) time: " << value;
  84. std::cout << "RandFloat(std::mt19937& rng, float min, float max) time: " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << "ns" << std::endl;
  85.  
  86. return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement