C++11随机数

本文介绍了一个使用C++11标准库实现的随机数生成器类。该类利用了std::default_random_engine, std::mt19937_64以及std::random_device等组件,并提供了通用的接口来生成指定范围内的随机整数和浮点数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#pragma once

#include <random>

// C++11随机数
class random_help
{
private:
	std::default_random_engine _engine;
	std::mt19937_64 _mt19937_gen;
	std::random_device _rd;
private:
	// noncopyable
	random_help(random_help&&)=delete;
	random_help& operator=(random_help&&)=delete;
	random_help(random_help const&)=delete;
	random_help& operator=(random_help const&)=delete;
public:
	random_help()
		:_mt19937_gen(_rd())
	{}
	~random_help()
	{}
	template<class _Ty1, class _Ty2, typename std::enable_if<std::is_integral<_Ty1>::value && std::enable_if<std::is_integral<_Ty1>::value, bool>::type = true>
	auto operator()(_Ty1 min_, _Ty2 max_)->decltype(min_ + max_)
	{
		if (min_ == max_)
			return min_;
		using _Ty = decltype(min_ + max_);
		_Ty _min = static_cast<_Ty>(min_);
		_Ty _max = static_cast<_Ty>(max_);

		if (_min > _max)
		{
			std::swap(_min, _max);
		}
		return std::uniform_int_distribution<_Ty>(_min, _max)(_mt19937_gen);
	}
	template<class _Ty1, class _Ty2, typename std::enable_if<std::is_floating_point<_Ty1>::value && std::enable_if<std::is_floating_point<_Ty1>::value, bool>::type = true>
	auto operator()(_Ty1 min_, _Ty2 max_)->decltype(min_ + max_)
	{
		if (min_ == max_)
			return min_;
		using _Ty = decltype(min_ + max_);
		_Ty _min = static_cast<_Ty>(min_);
		_Ty _max = static_cast<_Ty>(max_);

		if (_min > _max)
		{
			std::swap(_min, _max);
		}
		// uniform_real_distribution 是 [ ),用std::nextafter修正使取到[ ]
		if (std::is_same<float, _Ty>::value || std::is_same<unsigned float, _Ty>::value)
			return std::uniform_real_distribution<_Ty>(_min, std::nextafter(_max, FLT_MAX))(_mt19937_gen);
		else if (std::is_same<double, _Ty>::value || std::is_same<unsigned double, _Ty>::value)
			return std::uniform_real_distribution<_Ty>(_min, std::nextafter(_max, DBL_MAX))(_mt19937_gen);
		else // if (std::is_same<long double, _Ty>::value || std::is_same<unsigned long double, _Ty>::value)
			return std::uniform_real_distribution<_Ty>(_min, std::nextafter(_max, LDBL_MAX))(_mt19937_gen);
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值