40
40
#include < geogram/basic/numeric.h>
41
41
#include < stdlib.h>
42
42
43
+ #include < random>
44
+
43
45
#ifdef GEO_COMPILER_EMSCRIPTEN
44
46
#pragma GCC diagnostic ignored "-Wc++11-long-long"
45
47
#endif
46
48
47
49
namespace GEO {
48
50
49
51
namespace Numeric {
52
+
53
+ static std::mt19937_64 random_engine;
50
54
51
55
bool is_nan (float32 x) {
52
56
#ifdef GEO_COMPILER_MSVC
@@ -65,47 +69,19 @@ namespace GEO {
65
69
}
66
70
67
71
void random_reset () {
68
- #ifdef GEO_OS_WINDOWS
69
- srand (1 );
70
- #else
71
- srandom (1 );
72
- #endif
72
+ random_engine = {};
73
73
}
74
74
75
75
int32 random_int32 () {
76
- #ifdef GEO_OS_WINDOWS
77
- return rand ();
78
- #else
79
- return int32 (random () % std::numeric_limits<int32>::max ());
80
- #endif
76
+ return std::uniform_int_distribution<int32>(0 , RAND_MAX)(random_engine);
81
77
}
82
78
83
79
float32 random_float32 () {
84
- #if defined(GEO_OS_WINDOWS)
85
- return float (rand ()) / float (RAND_MAX);
86
- #elif defined(GEO_OS_ANDROID)
87
- // TODO: find a way to call drand48()
88
- // (problem at link time)
89
- return
90
- float (random_int32 ()) /
91
- float (std::numeric_limits<int32>::max ());
92
- #else
93
- return float (drand48 ());
94
- #endif
80
+ return std::uniform_real_distribution<float32>(0 , 1 )(random_engine);
95
81
}
96
82
97
83
float64 random_float64 () {
98
- #if defined(GEO_OS_WINDOWS)
99
- return double (rand ()) / double (RAND_MAX);
100
- #elif defined(GEO_OS_ANDROID)
101
- // TODO: find a way to call drand48()
102
- // (problem at link time)
103
- return
104
- double (random_int32 ()) /
105
- double (std::numeric_limits<int32>::max ());
106
- #else
107
- return double (drand48 ());
108
- #endif
84
+ return std::uniform_real_distribution<float64>(0 , 1 )(random_engine);
109
85
}
110
86
}
111
87
}
0 commit comments