Skip to content
This repository has been archived by the owner on Jul 19, 2024. It is now read-only.

Commit

Permalink
Implement rsl::rng with std::optional
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisThrasher authored and tylerjw committed Nov 28, 2022
1 parent 25ddce4 commit afe09b5
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions src/random.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,30 @@
#include <algorithm>
#include <array>
#include <functional>
#include <optional>
#include <stdexcept>

namespace rsl {

auto rng(std::seed_seq seed_sequence) -> std::mt19937& {
thread_local auto is_seeded = false;
if (is_seeded && seed_sequence.size() > 0)
thread_local auto generator = std::optional<std::mt19937>();

// Prevent reseeding the generator
if (generator.has_value() && seed_sequence.size() > 0)
throw std::runtime_error("rng cannot be re-seeded on this thread");

thread_local auto generator = [&seed_sequence]() {
is_seeded = true;
if (seed_sequence.size() > 0) return std::mt19937(seed_sequence);
auto seed_data = std::array<int, std::mt19937::state_size>();
auto random_device = std::random_device();
std::generate_n(std::data(seed_data), std::size(seed_data), std::ref(random_device));
auto sequence = std::seed_seq(std::begin(seed_data), std::end(seed_data));
return std::mt19937(sequence);
}();

return generator;
// Return existing generator
if (generator.has_value() && seed_sequence.size() == 0) return generator.value();

// Seed with specified sequence
if (seed_sequence.size() > 0) return generator.emplace(seed_sequence);

// Seed with randomized sequence
auto seed_data = std::array<int, std::mt19937::state_size>();
auto random_device = std::random_device();
std::generate_n(seed_data.data(), seed_data.size(), std::ref(random_device));
auto sequence = std::seed_seq(seed_data.begin(), seed_data.end());
return generator.emplace(sequence);
}

auto random_unit_quaternion() -> Eigen::Quaterniond {
Expand Down

0 comments on commit afe09b5

Please sign in to comment.