1
0
Fork 0

Fixed cFastRandom Test. (#3291)

This resolves #3290
This commit is contained in:
Alexander Harkness 2016-08-03 08:35:42 +01:00 committed by Mattes D
parent 38368f361d
commit 58b29adc88
4 changed files with 116 additions and 72 deletions

View File

@ -37,74 +37,6 @@ static unsigned int GetRandomSeed()
////////////////////////////////////////////////////////////////////////////////
// cFastRandom:
#if 0 && defined(_DEBUG)
// Self-test
// Both ints and floats are quick-tested to see if the random is calculated correctly, checking the range in ASSERTs,
// and if it performs well in terms of distribution (checked by avg, expected to be in the range midpoint
class cFastRandomTest
{
public:
cFastRandomTest(void)
{
TestInts();
TestFloats();
}
void TestInts(void)
{
printf("Testing ints...\n");
cFastRandom rnd;
int sum = 0;
const int BUCKETS = 8;
int Counts[BUCKETS];
memset(Counts, 0, sizeof(Counts));
const int ITER = 10000;
for (int i = 0; i < ITER; i++)
{
int v = rnd.NextInt(1000);
ASSERT(v >= 0);
ASSERT(v < 1000);
Counts[v % BUCKETS]++;
sum += v;
}
double avg = (double)sum / ITER;
printf("avg: %f\n", avg);
for (int i = 0; i < BUCKETS; i++)
{
printf(" bucket %d: %d\n", i, Counts[i]);
}
}
void TestFloats(void)
{
printf("Testing floats...\n");
cFastRandom rnd;
float sum = 0;
const int BUCKETS = 8;
int Counts[BUCKETS];
memset(Counts, 0, sizeof(Counts));
const int ITER = 10000;
for (int i = 0; i < ITER; i++)
{
float v = rnd.NextFloat(1000);
ASSERT(v >= 0);
ASSERT(v <= 1000);
Counts[((int)v) % BUCKETS]++;
sum += v;
}
sum = sum / ITER;
printf("avg: %f\n", sum);
for (int i = 0; i < BUCKETS; i++)
{
printf(" bucket %d: %d\n", i, Counts[i]);
}
}
} g_Test;
#endif
@ -187,7 +119,3 @@ double MTRand::rand(double a_Range)
std::uniform_real_distribution<> distribution(0, a_Range);
return distribution(m_MersenneRand);
}

View File

@ -10,6 +10,7 @@ add_subdirectory(BoundingBox)
add_subdirectory(ByteBuffer)
add_subdirectory(ChunkData)
add_subdirectory(CompositeChat)
add_subdirectory(FastRandom)
add_subdirectory(HTTP)
add_subdirectory(LoadablePieces)
add_subdirectory(Network)

View File

@ -0,0 +1,44 @@
enable_testing()
add_definitions(-DTEST_GLOBALS=1)
include_directories(${CMAKE_SOURCE_DIR}/src/)
add_definitions(-DTEST_GLOBALS=1)
set (SHARED_SRCS
${CMAKE_SOURCE_DIR}/src/FastRandom.cpp
${CMAKE_SOURCE_DIR}/src/OSSupport/StackTrace.cpp
)
set (SHARED_HDRS
${CMAKE_SOURCE_DIR}/src/FastRandom.h
${CMAKE_SOURCE_DIR}/src/OSSupport/StackTrace.h
)
set (SRCS
FastRandomTest.cpp
)
if (MSVC)
# Add the MSVC-specific LeakFinder / StackTracer sources:
list (APPEND SHARED_SRCS ${CMAKE_SOURCE_DIR}/src/LeakFinder.cpp ${CMAKE_SOURCE_DIR}/src/StackWalker.cpp)
list (APPEND SHARED_HDRS ${CMAKE_SOURCE_DIR}/src/LeakFinder.h ${CMAKE_SOURCE_DIR}/src/StackWalker.h)
endif()
source_group("Shared" FILES ${SHARED_SRCS} ${SHARED_HDRS})
source_group("Sources" FILES ${SRCS})
add_executable(FastRandom-exe ${SRCS} ${SHARED_SRCS} ${SHARED_HDRS})
if (WIN32)
target_link_libraries(FastRandom-exe ws2_32)
endif()
add_test(NAME FastRandom-test COMMAND FastRandom-exe)
# Put the projects into solution folders (MSVC):
set_target_properties(
FastRandom-exe
PROPERTIES FOLDER Tests
)

View File

@ -0,0 +1,71 @@
// FastRandomTest.cpp
// Tests the randomness of cFastRandom
#include "Globals.h"
#include "FastRandom.h"
static void TestInts(void)
{
cFastRandom rnd;
int sum = 0;
const int BUCKETS = 8;
int Counts[BUCKETS];
memset(Counts, 0, sizeof(Counts));
const int ITER = 10000;
for (int i = 0; i < ITER; i++)
{
int v = rnd.NextInt(1000);
assert_test(v >= 0);
assert_test(v < 1000);
Counts[v % BUCKETS]++;
sum += v;
}
double avg = static_cast<double>(sum) / ITER;
printf("avg: %f\n", avg);
for (int i = 0; i < BUCKETS; i++)
{
printf(" bucket %d: %d\n", i, Counts[i]);
}
}
static void TestFloats(void)
{
cFastRandom rnd;
float sum = 0;
const int BUCKETS = 8;
int Counts[BUCKETS];
memset(Counts, 0, sizeof(Counts));
const int ITER = 10000;
for (int i = 0; i < ITER; i++)
{
float v = rnd.NextFloat(1000);
assert_test(v >= 0);
assert_test(v <= 1000);
Counts[static_cast<int>(v) % BUCKETS]++;
sum += v;
}
sum = sum / ITER;
printf("avg: %f\n", sum);
for (int i = 0; i < BUCKETS; i++)
{
printf(" bucket %d: %d\n", i, Counts[i]);
}
}
int main(void)
{
LOGD("FastRandom Test started");
LOGD("Testing ints");
TestInts();
LOGD("Testing floats");
TestFloats();
LOG("FastRandom test finished");
}