7 #include <nlohmann/json.hpp> 10 #include <pcg_random.hpp> 15 using Point = Eigen::Vector3d;
18 using RandomNumberEngine = pcg32;
20 using RandomNumberEngine = std::mt19937;
37 std::uniform_real_distribution<double> dist01;
50 auto range(std::integral
auto min, std::integral
auto max)
52 return std::uniform_int_distribution<>(min, max)(engine);
61 template <
typename Iterator> Iterator
sample(Iterator begin, Iterator end)
63 std::advance(begin, range<>(0, std::distance(begin, end) - 1));
68 void to_json(nlohmann::json&,
const Random&);
69 void from_json(
const nlohmann::json&,
Random&);
86 std::discrete_distribution<> distribution;
87 std::vector<double> weights;
92 auto size()
const {
return data.size(); }
94 [[nodiscard]]
bool empty()
const {
return data.empty(); }
98 assert(!data.empty());
116 template <
typename Iterator>
void setWeight(Iterator begin, Iterator end)
122 if (
auto size = std::distance(begin, end); size == data.size()) {
123 weights.resize(size);
124 std::copy(begin, end, weights.begin());
125 distribution = std::discrete_distribution(weights.begin(), weights.end());
126 assert(
size_t(distribution.max()) == data.size() - 1);
129 throw std::runtime_error(
"number of weights must match data");
140 data.push_back(value);
141 weights.push_back(weight);
142 setWeight(weights.begin(), weights.end());
143 latest_index = data.size() - 1;
151 template <
typename RandomGenerator>
const T&
sample(RandomGenerator&
engine)
154 latest_index = distribution(engine);
155 return data.at(latest_index);
161 const Point& directions =
Point randomUnitVector(Random &rand, const Point &directions=Point::Ones())
Random unit vector using Neuman's method ("sphere picking")
void push_back(const T &value, double weight=1.0)
Add data and it's weight.
Definition: random.h:138
Eigen::Vector3d Point
3D vector used for positions, velocities, forces etc.
Definition: coordinates.h:7
void setWeight(Iterator begin, Iterator end)
Set weights for all data points in vec
Definition: random.h:116
auto range(std::integral auto min, std::integral auto max)
Integer in closed interval [min:max].
Definition: random.h:50
Random random
global instance of Random
Definition: random.cpp:62
Random number generator.
Definition: random.h:34
double operator()()
Random double in uniform range [0,1)
Definition: random.cpp:57
double T
floating point size
Definition: units.h:73
bool empty() const
True if no data points.
Definition: random.h:94
const T & sample(RandomGenerator &engine)
Get random data point respecting the weighted distribution.
Definition: random.h:151
Iterator sample(Iterator begin, Iterator end)
Pick random element in iterable range.
Definition: random.h:61
Point randomUnitVectorPolar(Random &rand)
Random unit vector using polar coordinates ("sphere picking")
void seed()
Set a non-deterministic ("hardware") seed.
Definition: random.cpp:47
auto size() const
Number of data points.
Definition: random.h:92
void clear()
Clear all data.
Definition: random.h:102
Random()
Constructor with deterministic seed.
Definition: random.cpp:52
Cell list class templates.
Definition: actions.cpp:11
Stores a series of elements with given weight.
Definition: random.h:83
std::vector< T > data
raw vector of T
Definition: random.h:90
RandomNumberEngine engine
Random number engine used for all operations.
Definition: random.h:39
size_t getLastIndex() const
index of last get() or addGroup() element
Definition: random.h:96