C++11 std 库有几个随机数生成器 (RNG),每个都实现了这个概念统一随机数生成器 http://en.cppreference.com/w/cpp/concept/UniformRandomNumberGenerator。然后可以将它们用作随机分布的参数,另请参阅本文档 http://en.cppreference.com/w/cpp/numeric/random以获得概述。
这种设计的优点是底层 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;
};
会员operator()
不能直接在单独的编译单元(CU)中实现,但必须在同一个头文件(或一个#include
d)。
对于单独的实现,理想情况下需要某种方式来打包 RNG,就像std::function<>
打包任何可调用对象。
(只需使用std::function
并提供以下值RNG::min()
and RNG::max()
因为在单独的 CU 中定义的函数的参数是有限制的,并且不允许使用,例如,std::uniform_real_distribution<>
里面)。
如何才能做到这一点?是否有可用的实现? std 库将来会提供这个吗?或者我是在转移注意力?
Edit随机数生成器需要具有static
会员min()
and max()
,使得类型擦除变得困难或不可能(GNU 的 libstdc++ 没有做出这个假设,并且使用非静态成员进行类型擦除min()
and max()
可以工作,但不能与 LLVM 的 libc++ 一起使用,它使用所需的标准static
成员)。还有办法解决这个问题吗?如果不是,这是否意味着 C++ 标准有一个糟糕的随机数生成器接口?
调整 RNG 为independent_bits_engine
,然后输入擦除适应的 RNG。您完全了解什么independent_bits_engine
's min()
and max()
are.
这是一个草图:
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;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)