Browse Source

Added RNG unit test.

Branimir Karadžić 8 years ago
parent
commit
bf39e556b0
3 changed files with 88 additions and 37 deletions
  1. 0 19
      include/bx/inline/rng.inl
  2. 0 18
      include/bx/rng.h
  3. 88 0
      tests/rng_test.cpp

+ 0 - 19
include/bx/inline/rng.inl

@@ -28,25 +28,6 @@ namespace bx
 		return (m_z<<16)+m_w;
 		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)
 	inline RngShr3::RngShr3(uint32_t _jsr)
 		: m_jsr(_jsr)
 		: m_jsr(_jsr)
 	{
 	{

+ 0 - 18
include/bx/rng.h

@@ -30,24 +30,6 @@ namespace bx
 		uint32_t m_w;
 		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
 	/// George Marsaglia's SHR3
 	class RngShr3
 	class RngShr3
 	{
 	{

+ 88 - 0
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 <bx/rng.h>
+#include <bx/file.h>
+
+const uint32_t kMax = 10<<20;
+
+template<typename Ty>
+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<<shift;
+			histBits[shift] += !!(0 != (val & mask) );
+		}
+
+		const uint32_t mf000 = (val & 0xff000000)>>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);
+}