Одна функция для получения случайных чисел.

JordanRudess
JordanRudess
#include <random>
#include <limits>

namespace Starl1ght {
	namespace Internal {
		template<typename ENGINE>
		ENGINE& GetEngine() {
			static std::random_device random_device;
			static ENGINE engine{ random_device() };
			return engine;
		}
	}

	template <typename T, typename U>
	T Random(const T& from, const U& to) {
		static_assert(std::is_same<T, U>::value, "Random() called with different types");
		return T{};
	}

	template <typename T>
	typename std::enable_if<!std::is_integral<T>::value && !std::is_floating_point<T>::value, T>::type
	Random(const T& from = std::numeric_limits<T>::lowest(), const T& to = std::numeric_limits<T>::max()) {
		static_assert(std::is_same<T, void>::value, "Random() called with non-number type");
		return T{};
	}

	template <typename T, typename ENGINE = std::mt19937>
	typename std::enable_if<std::is_integral<T>::value, T>::type
	Random(const T& from = std::numeric_limits<T>::min(), const T& to = std::numeric_limits<T>::max()) {
		return std::uniform_int_distribution<T>{ from, to }(Internal::GetEngine<ENGINE>());
	}
	
	template <typename T, typename ENGINE = std::mt19937>
	typename std::enable_if<std::is_floating_point<T>::value, T>::type
	Random(const T& from, const T& to) {
		return std::uniform_real_distribution<T>{ from, to }(Internal::GetEngine<ENGINE>());
	}
}

int main() {
	auto f = Starl1ght::Random(3.f, 5.f);
	return Starl1ght::Random(1, 5);
}
-5
рейтинг
2 комментария
ilnur.khuziev
получение случайных чисел обязано быть методом объекта (состояние которого/источник энтропии и алгоритм генерации задаются явно), а не функцией меняющей глобальное состояние.
ilnur.khuziev
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).