Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <random>
- #include <iostream>
- #include <chrono>
- #if RAND_MAX < 65536
- static const size_t XRAND_MAX = (RAND_MAX + 1) * (RAND_MAX + 1) - 1;
- static size_t xrand()
- {
- return rand() * (RAND_MAX + 1) + rand();
- }
- // rand() is already ok; no need to do anything.
- #else
- static const size_t XRAND_MAX = RAND_MAX;
- static size_t xrand()
- {
- return rand();
- }
- #endif
- size_t rand(size_t min_inclusive, size_t max_exclusive)
- {
- const size_t range = (max_exclusive - min_inclusive);
- // huge interval or min >= max
- if (range == 0 || range > XRAND_MAX)
- {
- std::cout << "x < ERR::INVALID_PARAM" << std::endl;
- return 0;
- }
- const size_t inv_range = XRAND_MAX / range;
- // generate random number in [0, range)
- // idea: avoid skewed distributions when <range> doesn't evenly divide
- // XRAND_MAX by simply discarding values in the "remainder".
- // not expected to run often since XRAND_MAX is large.
- size_t x;
- do
- {
- x = xrand();
- } while (x >= range * inv_range);
- x /= inv_range;
- x += min_inclusive;
- // if (x < max_exclusive)
- // std::cout << "x < max_exclusive" << std::endl;
- return x;
- }
- static float RandFloat(float min, float max)
- {
- return rand(min * 100.f, max * 100.f) / 100.f;
- }
- static float RandFloat(std::mt19937 &rng, float min, float max)
- {
- return std::uniform_real_distribution<float>(min, max)(rng);
- }
- int main()
- {
- int samples = 1000000;
- auto begin = std::chrono::high_resolution_clock::now();
- float value;
- for (int i = 0; i < samples; ++i)
- {
- value = RandFloat(0.f, 1.f);
- }
- auto end = std::chrono::high_resolution_clock::now();
- std::cout << "RandFloat(float min, float max): " << value;
- std::cout << "RandFloat(float min, float max): " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << "ns" << std::endl;
- begin = std::chrono::high_resolution_clock::now();
- for (int i = 0; i < samples; ++i)
- {
- std::mt19937 rng;
- rng.seed(i);
- value = RandFloat(rng, 0.f, 1.f);
- }
- end = std::chrono::high_resolution_clock::now();
- std::cout << "RandFloat(std::mt19937& rng, float min, float max) time: " << value;
- std::cout << "RandFloat(std::mt19937& rng, float min, float max) time: " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << "ns" << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement