tenno 0.1.0
Loading...
Searching...
No Matches
random.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#pragma once
7
8#include <limits>
9#include <tenno/array.hpp>
10
11namespace tenno
12{
13
14inline constexpr unsigned int lcg(const unsigned int seed)
15{
16 constexpr unsigned int a = 1664525;
17 constexpr unsigned int c = 1013904223;
18 constexpr unsigned int m = std::numeric_limits<unsigned int>::max();
19 return (a * seed + c) % m;
20}
21
22template <const unsigned int it>
23constexpr unsigned int gen(const unsigned int N)
24{
25 return lcg(gen<it - 1>(N));
26}
27
28template <> constexpr unsigned int gen<0>(const unsigned int N)
29{
30 return lcg(N);
31}
32
33template <const unsigned int it>
34constexpr float uniform_real_distribution(const unsigned int seed,
35 const float min = 0,
36 const float max = 1)
37{
38 constexpr unsigned int m = std::numeric_limits<unsigned int>::max();
39 const unsigned int n = gen<it>(seed);
40 const float normalized = static_cast<float>(n) / static_cast<float>(m);
41 return min + normalized * (max - min);
42}
43
44template <const tenno::size N, const tenno::size it>
46random_array_impl([[maybe_unused]] const int seed,
47 [[maybe_unused]] const float min,
48 [[maybe_unused]] const float max,
49 [[maybe_unused]] const tenno::array<float, N> vec)
50{
51 if constexpr (it >= N)
52 {
53 return vec;
54 }
55 else
56 {
57 tenno::array<float, N> new_vec = vec;
58 new_vec[it] = uniform_real_distribution<it>(seed, min, max);
59 return random_array_impl<N, it + 1>(seed, min, max, new_vec);
60 }
61}
62
63template <const tenno::size N>
65random_array(const int seed, const float min = 0, const float max = 1)
66{
67 constexpr tenno::array<float, N> vec;
68 return random_array_impl<N, 0>(seed, min, max, vec);
69}
70
71} // namespace tenno
A fixed-size array.
Definition array.hpp:33
constexpr unsigned int gen(const unsigned int N)
Definition random.hpp:23
constexpr unsigned int gen< 0 >(const unsigned int N)
Definition random.hpp:28
constexpr tenno::array< float, N > random_array_impl(const int seed, const float min, const float max, const tenno::array< float, N > vec)
Definition random.hpp:46
constexpr unsigned int lcg(const unsigned int seed)
Definition random.hpp:14
constexpr tenno::array< float, N > random_array(const int seed, const float min=0, const float max=1)
Definition random.hpp:65
constexpr float uniform_real_distribution(const unsigned int seed, const float min=0, const float max=1)
Definition random.hpp:34