| 46 | */ |
| 47 | template <typename T, int size> |
| 48 | inline std::array<T, size> random_array() |
| 49 | { |
| 50 | std::array<T, size> ret; |
| 51 | auto& mersenne_engine = random_engine(); |
| 52 | if constexpr (base::is_floating_point_v<T>) { |
| 53 | using actual_type = std::conditional_t<std::floating_point<T>, T, float>; |
| 54 | std::uniform_real_distribution<actual_type> value_dist{std::numeric_limits<T>::min(), std::numeric_limits<T>::max()}; |
| 55 | auto value_gen = [&value_dist, &mersenne_engine]() { |
| 56 | return value_dist(mersenne_engine); |
| 57 | }; |
| 58 | std::generate(ret.begin(), ret.end(), value_gen); |
| 59 | } else if constexpr (std::is_same_v<bool, T>) { |
| 60 | std::bernoulli_distribution value_dist(0.5); |
| 61 | auto value_gen = [&value_dist, &mersenne_engine]() { |
| 62 | return value_dist(mersenne_engine); |
| 63 | }; |
| 64 | std::generate(ret.begin(), ret.end(), value_gen); |
| 65 | } else if constexpr (sizeof(T) == 1) { |
| 66 | // Handle 8-bit types separately |
| 67 | using dist_type = std::conditional_t<std::is_signed_v<T>, int, unsigned int>; |
| 68 | std::uniform_int_distribution<unsigned int> value_dist{std::numeric_limits<T>::min(), std::numeric_limits<T>::max()}; |
| 69 | auto value_gen = [&value_dist, &mersenne_engine]() { |
| 70 | return static_cast<T>(value_dist(mersenne_engine)); |
| 71 | }; |
| 72 | std::generate(ret.begin(), ret.end(), value_gen); |
| 73 | } else { |
| 74 | std::uniform_int_distribution<T> value_dist{std::numeric_limits<T>::min(), std::numeric_limits<T>::max()}; |
| 75 | auto value_gen = [&value_dist, &mersenne_engine]() { |
| 76 | return value_dist(mersenne_engine); |
| 77 | }; |
| 78 | std::generate(ret.begin(), ret.end(), value_gen); |
| 79 | } |
| 80 | return ret; |
| 81 | } |
| 82 | |
| 83 | /** |
| 84 | * @brief Generates a random vector of a given type, size, and range. |