19 extern thread_local std::unique_ptr<std::mt19937>
PRNG;
57 void Shuffle(
const uint32_t num_to_shuffle, std::vector<T>* elems);
65 if (
PRNG ==
nullptr) {
69 std::uniform_int_distribution<T> distribution(min, max);
71 return distribution(*
PRNG);
76 if (
PRNG ==
nullptr) {
80 std::uniform_real_distribution<T> distribution(min, max);
82 return distribution(*
PRNG);
87 if (
PRNG ==
nullptr) {
91 std::normal_distribution<T> distribution(mean,
stddev);
92 return distribution(*
PRNG);
96 void Shuffle(
const uint32_t num_to_shuffle, std::vector<T>* elems) {
97 CHECK_LE(num_to_shuffle, elems->size());
98 const uint32_t last_idx =
static_cast<uint32_t
>(elems->size() - 1);
99 for (uint32_t i = 0; i < num_to_shuffle; ++i) {
100 const auto j = RandomInteger<uint32_t>(i, last_idx);
static int kDefaultPRNGSeed
void SetPRNGSeed(unsigned seed)
thread_local std::unique_ptr< std::mt19937 > PRNG
T RandomInteger(const T min, const T max)
T RandomGaussian(const T mean, const T stddev)
T RandomReal(const T min, const T max)
void Shuffle(const uint32_t num_to_shuffle, std::vector< T > *elems)
void swap(cloudViewer::core::SmallVectorImpl< T > &LHS, cloudViewer::core::SmallVectorImpl< T > &RHS)
Implement std::swap in terms of SmallVector swap.
double stddev(std::vector< double > const &func)