Loading...
Searching...
No Matches
random.h
1/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
2 * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
3 * Author(s): Vincent Rouvreau
4 *
5 * Copyright (C) 2026 Inria
6 *
7 * Modification(s):
8 * - YYYY/MM Author: Description of the modification
9 */
10
11#ifndef GUDHI_RANDOM_H_
12#define GUDHI_RANDOM_H_
13
14#include <random> // for std::random_device, std::mt19937_64, std::uniform_real_distribution
15#include <vector>
16#include <algorithm> // for std::generate
17#include <cstddef> // for std::size_t
18#ifdef DEBUG_TRACES
19#include <iostream>
20#endif // DEBUG_TRACES
21
22namespace Gudhi {
23
24namespace random {
25
48
52 using Random_generator = std::mt19937_64;
53
54#if defined( GUDHI_DEFAULT_RANDOM_DLL_EXPORT ) && defined( GUDHI_DEFAULT_RANDOM_DLL_IMPORT )
55#error "GUDHI_DEFAULT_RANDOM_DLL_EXPORT and GUDHI_DEFAULT_RANDOM_DLL_IMPORT cannot be enabled at the same time"
56#endif // GUDHI_DEFAULT_RANDOM_DLL_EXPORT && GUDHI_DEFAULT_RANDOM_DLL_IMPORT
57
58// Defined but empty by default
59#define GUDHI_RANDOM_DLL_API
60
61#if defined(_WIN32)
62 #if defined GUDHI_DEFAULT_RANDOM_DLL_EXPORT
63 #define GUDHI_RANDOM_DLL_API __declspec(dllexport)
64 #endif
65 #if defined GUDHI_DEFAULT_RANDOM_DLL_IMPORT
66 #define GUDHI_RANDOM_DLL_API __declspec(dllimport)
67 #endif
68#else
69 #if defined GUDHI_DEFAULT_RANDOM_DLL_EXPORT
70 // In case we start using '-fvisibility=hidden'
71 #define GUDHI_RANDOM_DLL_API __attribute__((visibility("default")))
72 #endif
73#endif
74
75 GUDHI_RANDOM_DLL_API Random_generator& get_default_random();
76
77#if defined GUDHI_DEFAULT_RANDOM_DLL_IMPORT
78 // No declaration, only definition
79#else
85 #if !defined GUDHI_DEFAULT_RANDOM_DLL_EXPORT
86 inline
87 #endif
89 thread_local Random_generator default_random{std::random_device{}()};
90#ifdef DEBUG_TRACES
91 std::clog << "get_default_random() " << &default_random << "\n";
92#endif // DEBUG_TRACES
93 return default_random;
94 }
95#endif // GUDHI_DEFAULT_RANDOM_DLL_IMPORT
96
102 void set_seed(Random_generator::result_type seed) {
103 get_default_random().seed(seed);
104 }
105
116 template <typename Type, typename CustomRandomGenerator = Random_generator&>
117 Type get_uniform(const Type& min, const Type& max, CustomRandomGenerator&& rng = get_default_random()) {
118 if constexpr (std::is_floating_point_v<Type>) {
119 std::uniform_real_distribution<Type> dis(min, max);
120 return dis(rng);
121 } else if constexpr (std::is_integral_v<Type>) {
122 std::uniform_int_distribution<Type> dis(min, max);
123 return dis(rng);
124 }
125 }
126
138 template <typename Type, typename CustomRandomGenerator = Random_generator&>
139 std::vector<Type> get_uniform_range(std::size_t nbr, const Type& min, const Type& max,
140 CustomRandomGenerator&& rng = get_default_random()) {
141 // With C++26, this should be replaced with std::ranges::generate_random
142 std::vector<Type> result(nbr);
143 if constexpr (std::is_floating_point_v<Type>) {
144 std::uniform_real_distribution<Type> dis(min, max);
145 std::generate(result.begin(), result.end(), [&]() { return dis(rng); });
146 } else if constexpr (std::is_integral_v<Type>) {
147 std::uniform_int_distribution<Type> dis(min, max);
148 std::generate(result.begin(), result.end(), [&]() { return dis(rng); });
149 }
150 return result;
151 }
152
153 // end defgroup random
155
156} // namespace random
157
158} // namespace Gudhi
159
160#endif // GUDHI_RANDOM_H_
GUDHI_RANDOM_DLL_API Random_generator & get_default_random()
Returns a thread-local default random number generator instance.
Definition random.h:88
void set_seed(Random_generator::result_type seed)
Sets the seed for the default random engine.
Definition random.h:102
std::vector< Type > get_uniform_range(std::size_t nbr, const Type &min, const Type &max, CustomRandomGenerator &&rng=get_default_random())
Generates a vector of N random numbers in the range [min, max].
Definition random.h:139
Type get_uniform(const Type &min, const Type &max, CustomRandomGenerator &&rng=get_default_random())
Generates a random number in the range [min, max].
Definition random.h:117
std::mt19937_64 Random_generator
Definition random.h:52
Gudhi namespace.
Definition SimplicialComplexForAlpha.h:14