Loading...
Searching...
No Matches
random.h
Go to the documentation of this file.
1#ifndef _BBM_NATIVE_RANDOM_H_
2#define _BBM_NATIVE_RANDOM_H_
3
4#include <limits>
5#include <random>
6
7#include "backbone/type_traits.h"
8#include "backbone/array.h"
9#include "backbone/control.h"
10
11#include "util/multirange_for.h"
12
13/************************************************************************/
14/*! \filename random.h
15
16 \brief Random number generator; built on top of STL
17
18*************************************************************************/
19
20namespace backbone {
21
22 /**********************************************************************/
23 /*! \brief seed type
24 **********************************************************************/
25 using seed_t = std::uint_fast64_t;
26
27 /**********************************************************************/
28 /*! \brief Default seed
29 **********************************************************************/
30 static constexpr seed_t default_seed = std::mt19937_64::default_seed;
31
32 /**********************************************************************/
33 /*! \brief Forward declaration; specialized below
34 **********************************************************************/
35 template<typename T> struct rng;
36
37 /**********************************************************************/
38 /*! \brief Integral specialization
39 **********************************************************************/
40 template<typename T> requires std::integral<T>
41 struct rng<T>
42 {
43 using type = T;
44
45 //@{ \name Constructors
46 inline rng(void) : _rng(default_seed) {}
47 inline rng(seed_t seed, type lower=0, type upper=std::numeric_limits<T>::max()) : _dist(lower, upper), _rng(seed) {}
48 inline rng(type lower, type upper) : _dist(lower, upper), _rng(default_seed) {}
49 //! @}
50
51 //! \brief set the seed
52 inline void seed(seed_t seed)
53 {
54 _rng.seed(seed);
55 }
56
57 //! \brief get next number
58 inline type operator()(void)
59 {
60 return _dist(_rng);
61 }
62
63 private:
64 std::mt19937_64 _rng;
65 std::uniform_int_distribution<T> _dist;
66 };
67
68 /**********************************************************************/
69 /*! \brief Floating point specialization
70 **********************************************************************/
71 template<typename T> requires std::floating_point<T>
72 struct rng<T>
73 {
74 using type = T;
75
76 //! @{ Constructors
77 inline rng(void) {}
78 inline rng(auto seed, type lower=0, type upper=1) : _dist(lower, upper), _rng(seed) {}
79 inline rng(type lower, type upper) : _dist(lower, upper) {}
80 //! @}
81
82 //! \brief set the seed
83 inline void seed(auto seed)
84 {
85 _rng.seed(seed);
86 }
87
88 //! \brief get next number
89 inline type operator()(void)
90 {
91 return _dist(_rng);
92 }
93
94 private:
95 std::mt19937_64 _rng;
96 std::uniform_real_distribution<T> _dist;
97 };
98
99 /**********************************************************************/
100 /*! \brief Array specialization
101 **********************************************************************/
102 template<typename T> requires is_array_v<T>
103 struct rng<T> : public rng<scalar_t<T>>
104 {
105 using type = T;
106
107 //! Constructor passthrough
108 using rng<scalar_t<T>>::rng;
109
110 //! \brief get next number
111 inline type operator()(void)
112 {
113 type result;
114 bbm::multirange_for([&](auto& r)
115 {
116 r = static_cast<rng<scalar_t<T>>&>(*this)();
117 }, result);
118 return result;
119 }
120 };
121
122} // end backbone namespace
123
124#endif /* _BBM_NATIVE_RANDOM_H_ */
125
ranged for loop over multiple containers at once
Random number generator; built on top of Drjit.
Definition: backbone.h:53
drjit::scalar_t< std::decay_t< T > > scalar_t
Scalar trait.
Definition: type_traits.h:36
uint64_t seed_t
seed type
Definition: random.h:22
static constexpr seed_t default_seed
Definition: random.h:27
void multirange_for(FUNC &&func, Ts &&... containers)
ranged for loop over multiple containers at once
Definition: multirange_for.h:43
rng(auto seed, type lower=0, type upper=1)
Definition: random.h:78
rng(void)
Definition: random.h:46
void seed(seed_t seed)
set the seed
Definition: random.h:52
T type
Definition: random.h:43
void seed(auto seed)
set the seed
Definition: random.h:83
std::mt19937_64 _rng
Definition: random.h:64
rng(type lower, type upper)
Definition: random.h:48
type operator()(void)
get next number
Definition: random.h:58
rng(seed_t seed, type lower=0, type upper=std::numeric_limits< T >::max())
Definition: random.h:47
std::uniform_real_distribution< T > _dist
Definition: random.h:96
std::uniform_int_distribution< T > _dist
Definition: random.h:65
Random generator wrapper around Drjit's PCG32.
Definition: random.h:34
rng(void)
Constructors.
Definition: random.h:38
void seed(auto seed)
set the seed
Definition: random.h:56
drjit::PCG32< T > _rng
Definition: random.h:81