new randomness functions

v1
Brett 2023-07-23 13:10:11 -04:00
parent 529d996a38
commit ec16f5412b
3 changed files with 62 additions and 5 deletions

View File

@ -9,7 +9,41 @@
#include <random> #include <random>
namespace blt { namespace blt::random {
static inline uint32_t PCG_Hash(uint32_t input) {
uint32_t state = input * 747796405u + 2891336453u;
uint32_t word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
return (word >> 22u) ^
word;
}
static inline float randomFloat(uint32_t& seed){
seed = PCG_Hash(seed);
return (float)seed / (float)std::numeric_limits<uint32_t>::max();
}
/**
* @return random float without changing seed
*/
static inline float randomFloat_c(uint32_t seed){
return randomFloat(seed);
}
/**
* @param seed seed for random
* @param min inclusive min
* @param max exclusive max
* @return random int between min (inclusive) and max (exclusive)
*/
static inline int randomInt(uint32_t& seed, int min = 0, int max = 1){
return (int)((randomFloat(seed) * (float)(max - min)) + (float)min);
}
static inline int randomInt_c(uint32_t seed, int min = 0, int max = 1){
return randomInt(seed, min, max);
}
/** /**
* Creates a container class for generating random number distributions * Creates a container class for generating random number distributions
* @tparam T numeric type * @tparam T numeric type
@ -28,17 +62,19 @@ namespace blt {
* @param max max value possible to generate. (default: 1) * @param max max value possible to generate. (default: 1)
* @param seed seed to use in generating random values. (default: 0) * @param seed seed to use in generating random values. (default: 0)
*/ */
explicit random(T min = (T)0, T max = (T)1, long seed = 0): gen(std::mt19937(seed)){ explicit random(T min = (T) 0, T max = (T) 1, long seed = 0): gen(std::mt19937(seed)) {
distribution = new dist(min, max); distribution = new dist(min, max);
} }
/** /**
* Note the min/max are inclusive and defaults to a **uniform** distribution. * Note the min/max are inclusive and defaults to a **uniform** distribution.
* @return random number between the defined min/max or the default of [0,1]. * @return random number between the defined min/max or the default of [0,1].
*/ */
T get(){ T get() {
return (*distribution)(gen); return (*distribution)(gen);
} }
~random(){
~random() {
delete distribution; delete distribution;
} }
}; };
@ -52,6 +88,7 @@ namespace blt {
} }
}; };
} }
#endif //BLT_RANDOM_H #endif //BLT_RANDOM_H

View File

@ -57,5 +57,25 @@ int main() {
BLT_ERROR("Hello Error!"); BLT_ERROR("Hello Error!");
BLT_FATAL("Hello Fatal!"); BLT_FATAL("Hello Fatal!");
int vals[100];
for (int & val : vals)
val = 0;
uint32_t seed = 1023;
for (int i = 0; i < 1203000; i++){
seed = seed * i;
vals[blt::random::randomInt(seed, 0, 100)]++;
}
std::fstream csv("./randoms2.csv", std::ios::out);
csv << "index,count\n";
for (int i = 0; i < 100; i++){
csv << i << "," << vals[i] << "\n";
}
csv.close();
return 0; return 0;
} }

View File

@ -129,7 +129,7 @@ static inline void random_access() {
} }
static inline void test_queues() { static inline void test_queues() {
blt::random<int, std::uniform_int_distribution> rand{1, 100}; blt::random::random<int, std::uniform_int_distribution> rand{1, 100};
for (int& value : values){ for (int& value : values){
value = rand.get(); value = rand.get();