C++ 11 std库有几个随机数生成器(RNG),每个生成器实现UniformRandomNumberGenerator概念.然后可以将它们用作随机分布的参数,另请参阅此文档以获取概述.
这种设计的优点是底层RNG引擎的选择与其应用分离.但是,该设计还要求对RNG的所有调用的定义(不仅仅是声明)是可用的(如果RNG类型仍未指定为模板参数).因此,在
struct complicated_random_distribution
{
/*
some data and auxiliary methods here
*/
// complicated; may call RNG::operator() many times
template<typename RNG>
some_type operator()(RNG&gen) const;
};
Run Code Online (Sandbox Code Playgroud)
该成员operator()不能直接在单独的编译单元(CU)中实现,但必须在相同的头文件中(或#include从其中一个d)中可用.
对于单独的实现,理想情况下,想要某种方式来打包RNG的方式与std::function<>打包任何可调用对象的方式相同.(简单地使用std::function和提供单独CU中定义的函数的值RNG::min()和RNG::max()作为参数是限制性的,并且不允许使用,例如,std::uniform_real_distribution<>在内部).
如何才能做到这一点?这个实现是否可用?std库将来会提供这个吗?还是我在吃了一只红鲱鱼?
编辑随机数生成器需要有static成员,min()并且max()使类型擦除变得困难或不可能(GNU的libstdc ++没有做出这种假设,并且使用非静态成员进行类型擦除min()和max()工作,但不能使用LLVM的libc ++,它使用所需的标准static成员).还有办法还能解决这个问题吗?如果没有,这是否意味着C++标准对随机数生成器有一个拙劣的界面?
使用 调整 RNG independent_bits_engine,然后键入擦除调整后的 RNG。您完全了解 和independent_bits_engine是min()什么max()。
这是一个草图:
struct RNG_wrapper {
using result_type = std::uint32_t;
static constexpr result_type min() { return 0; }
static constexpr result_type max() { return 0xFFFFFFFF; }
template<class RNG>
using my_engine_type = std::independent_bits_engine<RNG, 32, result_type>;
template<class RNG,
class = std::enable_if_t<!std::is_same<std::decay_t<RNG>, RNG_wrapper>{}>>
RNG_wrapper(RNG&& r)
: rng(my_engine_type<std::decay_t<RNG>>(std::forward<RNG>(r))) {}
result_type operator()() { return rng(); }
std::function<result_type()> rng;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
387 次 |
| 最近记录: |