From a72058eb65e6328afc19c780198820e9f73e21ff Mon Sep 17 00:00:00 2001 From: Nik Date: Tue, 28 Mar 2023 09:28:28 +0200 Subject: [PATCH] includes/std: Added std::random functions --- includes/std/random.pat | 63 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 includes/std/random.pat diff --git a/includes/std/random.pat b/includes/std/random.pat new file mode 100644 index 0000000..5b42716 --- /dev/null +++ b/includes/std/random.pat @@ -0,0 +1,63 @@ +#pragma once + +#include + +/*! + Library to generate random numbers. Supports various different distribution types. +*/ + +namespace std::random { + + /** + Represents the type of distribution to use to generate a random number + */ + enum Distribution : u8 { + Uniform = 0, + Normal = 1, + Exponential = 2, + Gamma = 3, + Weibull = 4, + ExtremeValue = 5, + ChiSquared = 6, + Cauchy = 7, + FisherF = 8, + StudentT = 9, + LogNormal = 10, + Discrete = 11, + Bernoulli = 12, + Binomial = 13, + NegativeBinomial = 14, + Geometric = 15, + Poisson = 16 + }; + + /** + Sets the seed of the random number generator + @param seed Seed to use + */ + fn set_seed(u64 seed) { + builtin::std::random::set_seed(seed); + }; + + /** + Generates a random number using the given distribution with the given parameters. + The random number generator used internally is C++'s std::mt19937_64 Mersenne Twister implementation. + @param distribution Distribution to use + @param param1 This parameter depends on the type of distribution used. + @param param2 This parameter depends on the type of distribution used. + */ + fn generate_using(Distribution distribution, auto param1 = 0, auto param2 = 0) { + return builtin::std::random::generate(u32(distribution), param1, param2); + }; + + + /** + Generates a uniformly distributed random number between `min` and `max` + @param min Minimum number + @param max Maximum number + */ + fn generate(u64 min = std::limits::u64_min(), u64 max = std::limits::u64_max()) { + return std::random::generate_using(Distribution::Uniform, min, max); + }; + +}