我看到std :: shuffle采用URNG参数。 我正在使用自定义版本的生成器(WELL512a),并希望将它与std :: shuffle一起使用。
我的问题是:是否可以将它与std :: shuffle一起使用? 例如,可能使用URNG作为基类?
谢谢!
答案 0 :(得分:5)
我们可以从std::shuffle上的cppreference文档中看到:
URNG必须符合UniformRandomNumberGenerator的要求。
遗憾的是,该网站没有记录这些要求是什么,所以我们需要转到草案C ++ 11标准部分26.5.1.3
统一随机数生成器要求,其中说明如下:
G类型的均匀随机数生成器g是函数对象 返回无符号整数值,使得每个值都在范围内 可能的结果(理想情况下)返回的概率相等
- 醇>
G类满足统一随机数发生器的要求 表116中所示的表达式是有效的并具有指示 语义,如果G也满足其他所有要求 第26.5.1.3节。在该表和整个部分中:
- T是 由G的关联result_type和
命名的类型- g是
的值
表116
总结如下:
以下关系应成立:G :: min()< ģ:: MAX()。
更新
要说明何时 T是无符号整数类型,它表示3.9.1
基本类型部分中涵盖的以下类型之一,其中包括:
这还包括扩展无符号整数类型,例如 uinit64_t ,如果您的平台支持它们。
答案 1 :(得分:3)
URNG
是模板参数的名称 - 它不是特定类型。您需要实现满足特定要求的对象,然后将其传递给std::shuffle
。这些方面的东西:
class MyRNG {
public:
typedef size_t result_type;
static size_t min() { return 0; }
static size_t max() { return 42; }
size_t operator()() {
// generate a random number in the range [0, 42]
}
};
std::shuffle(someVector.begin(), someVector.end(), MyRNG());
您也可以考虑使用std::random_shuffle
。该对象采用对象r
,对于某个整数r(n)
可以调用n
,并生成[0, n)
范围内的随机数。
注意: std::random_shuffle
在C ++ 14中已弃用。