87 lines
2.5 KiB
C++
87 lines
2.5 KiB
C++
//
|
|
// main.cpp
|
|
// rng
|
|
//
|
|
// Created by Asher Falcon on 17/06/2025.
|
|
//
|
|
|
|
#include "rng.h"
|
|
#include "generators/LCG/lehmer.h"
|
|
#include "generators/mt19937.h"
|
|
#include "generators/xorshift.h"
|
|
#include "randomness_tests/frequency_monobit.h"
|
|
#include "randomness_tests/frequency_block.h"
|
|
#include "randomness_tests/runs.h"
|
|
#include "randomness_tests/runs_ones.h"
|
|
#include "randomness_tests/binary_matrix.h"
|
|
|
|
|
|
#include "generators/generator.h"
|
|
#include "randomness_tests/rngtest.h"
|
|
|
|
namespace splat {
|
|
template <typename T>
|
|
void addGen(std::vector<std::unique_ptr<PRNG>> &generators, uint32_t &seed){
|
|
generators.push_back(std::make_unique<T>(seed));
|
|
}
|
|
|
|
std::vector<std::unique_ptr<PRNG>> getAllGenerators(uint32_t seed){
|
|
std::vector<std::unique_ptr<PRNG>> generators;
|
|
|
|
// add generators here
|
|
addGen<mt19937_generator>(generators, seed);
|
|
addGen<lehmer_generator>(generators, seed);
|
|
addGen<xorshift32_generator>(generators,seed);
|
|
|
|
return generators;
|
|
}
|
|
|
|
template <typename T>
|
|
void addTest(std::vector<std::unique_ptr<RNGTEST>> &tests, std::vector<std::bitset<32>> &data){
|
|
tests.push_back(std::make_unique<T>(data));
|
|
}
|
|
|
|
std::vector<std::unique_ptr<RNGTEST>> getAllTests(std::vector<std::bitset<32>> &data){
|
|
std::vector<std::unique_ptr<RNGTEST>> tests;
|
|
|
|
// add generators here
|
|
addTest<frequency_monobit_test>(tests, data);
|
|
addTest<frequency_block_test>(tests, data);
|
|
addTest<runs_test>(tests, data);
|
|
addTest<runs_ones_test>(tests, data);
|
|
addTest<binary_matrix_test>(tests, data);
|
|
|
|
return tests;
|
|
}
|
|
|
|
}
|
|
|
|
int main(int argc, const char * argv[]) {
|
|
|
|
int seed = 9472161;
|
|
int blocksgenerated = 1000000;
|
|
|
|
std::vector<std::unique_ptr<splat::PRNG>> generators = splat::getAllGenerators(seed);
|
|
|
|
for(const std::unique_ptr<splat::PRNG> &generator : generators){
|
|
std::cout << generator->getName() << ": \n";
|
|
std::vector<std::bitset<32>> bits;
|
|
for(int i=0; i<blocksgenerated; i++){
|
|
bits.push_back(generator->generate());
|
|
}
|
|
|
|
std::vector<std::unique_ptr<splat::RNGTEST>> tests = splat::getAllTests(bits);
|
|
|
|
for(const std::unique_ptr<splat::RNGTEST> &test : tests){
|
|
std::string namestr = test->getName();
|
|
while(namestr.length() < 30){
|
|
namestr.append(" ");
|
|
}
|
|
std::cout << " - " << namestr << " = " << (test->passed()?"✅ PASS":"❌ FAIL") << " ("<< std::fixed << std::setprecision(8) << test->value() <<")\n";
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
};
|