diff --git a/include/bx/inline/rng.inl b/include/bx/inline/rng.inl index 1cda221..df6c826 100644 --- a/include/bx/inline/rng.inl +++ b/include/bx/inline/rng.inl @@ -28,25 +28,6 @@ namespace bx return (m_z<<16)+m_w; } - inline RngFib::RngFib(uint32_t _a, uint32_t _b) - : m_a(_a) - , m_b(_b) - { - } - - inline void RngFib::reset(uint32_t _a, uint32_t _b) - { - m_a = _a; - m_b = _b; - } - - inline uint32_t RngFib::gen() - { - m_b = m_a+m_b; - m_a = m_b-m_a; - return m_a; - } - inline RngShr3::RngShr3(uint32_t _jsr) : m_jsr(_jsr) { diff --git a/include/bx/rng.h b/include/bx/rng.h index e2c9ca8..22fff27 100644 --- a/include/bx/rng.h +++ b/include/bx/rng.h @@ -30,24 +30,6 @@ namespace bx uint32_t m_w; }; - /// George Marsaglia's FIB - class RngFib - { - public: - /// - RngFib(uint32_t _a = 9983651, uint32_t _b = 95746118); - - /// - void reset(uint32_t _a = 9983651, uint32_t _b = 95746118); - - /// - uint32_t gen(); - - private: - uint32_t m_a; - uint32_t m_b; - }; - /// George Marsaglia's SHR3 class RngShr3 { diff --git a/tests/rng_test.cpp b/tests/rng_test.cpp new file mode 100644 index 0000000..89fef3f --- /dev/null +++ b/tests/rng_test.cpp @@ -0,0 +1,88 @@ +/* + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bx#license-bsd-2-clause + */ + +#include "test.h" + +#include +#include + +const uint32_t kMax = 10<<20; + +template +void testRng(const char* _name, Ty* _rng) +{ + uint32_t histBits[32]; + uint32_t histUint8[256]; + + bx::memSet(histBits, 0, sizeof(histBits) ); + bx::memSet(histUint8, 0, sizeof(histUint8) ); + + for (uint32_t ii = 0; ii < kMax; ++ii) + { + uint32_t val = _rng->gen(); + + for (uint32_t shift = 0; shift < 32; ++shift) + { + const uint32_t mask = 1<>24; + const uint32_t m0f00 = (val & 0x00ff0000)>>16; + const uint32_t m00f0 = (val & 0x0000ff00)>> 8; + const uint32_t m000f = (val & 0x000000ff)>> 0; + + histUint8[mf000]++; + histUint8[m0f00]++; + histUint8[m00f0]++; + histUint8[m000f]++; + } + + bx::WriterI* writer = bx::getNullOut(); + bx::writePrintf(writer, "%s\n", _name); + + { + bx::writePrintf(writer, "\tbits histogram:\n"); + uint32_t min = UINT32_MAX; + uint32_t max = 0; + + for (uint32_t ii = 0; ii < BX_COUNTOF(histBits); ++ii) + { + bx::writePrintf(writer, "\t\t%3d: %d\n", ii, histBits[ii]); + min = bx::min(min, histBits[ii]); + max = bx::max(max, histBits[ii]); + } + + bx::writePrintf(writer, "\tmin: %d, max: %d (diff: %d)\n", min, max, max-min); + + REQUIRE(max-min < 8000); + } + + { + bx::writePrintf(writer, "\tuint8_t histogram:\n"); + uint32_t min = UINT32_MAX; + uint32_t max = 0; + + for (uint32_t ii = 0; ii < BX_COUNTOF(histUint8); ++ii) + { + bx::writePrintf(writer, "\t\t%3d: %d\n", ii, histUint8[ii]); + min = bx::min(min, histUint8[ii]); + max = bx::max(max, histUint8[ii]); + } + + bx::writePrintf(writer, "\tmin: %d, max: %d (diff: %d)\n", min, max, max-min); + + REQUIRE(max-min < 8000); + } +} + +TEST_CASE("Rng", "") +{ + bx::RngMwc mwc; + testRng("RngMwc", &mwc); + + bx::RngShr3 shr3; + testRng("RngShr3", &shr3); +}