rng/main.cpp

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;
};