使用std :: uniform_int_distribution并稍后定义其范围

时间:2015-02-04 18:41:47

标签: c++ c++11 random

我有问题,我想在结构中创建std::uniform_int_distribution,然后稍后给出它的范围。以下是我想要的。

#include <random>
#include <iostream>

std::random_device rd;
std::mt19937 gen(rd());

struct group_s {
   int k;
   std::uniform_int_distribution<> dis;
} group;


int main()
{  
    group.dis(0,19);
    std::cout << group.dis(gen) << ' ';
}

我收到以下错误:

no match for call to '(std::uniform_int_distribution<>) (int, int)'
  cpu_group.dis(0,19);

我该怎么做?

3 个答案:

答案 0 :(得分:4)

使用param()

using param_t = std::uniform_int_distribution<>::param_type;

group.dis.param(param_t(0, 19));

如果每次使用分布时参数都会更改,那么您也可以考虑使用operator()的双参数重载:

std::cout << group.dis(gen, param_t(0, 19)) << ' ';

由于允许分发对象存储在先前operator()调用期间获得的额外熵,因此这种方法比构建新分发对象和分配它更有效。

请注意,cppreference页面不完整,并未记录标准对param_type施加的要求。给定分发类型D及其关联的param_type P

  

对于D的每个构造函数,它们使用相应的参数   分布参数P应具有相应的参数   构造函数受相同要求和参数的约束   数量,类型和默认值相同。而且,对于每一个   D的成员函数返回对应的值   分布参数P应具有相应的成员   具有相同名称,类型和语义的函数。

(§26.5.1.6[rand.req.dist] / p9)

答案 1 :(得分:1)

你可以做到

group.dis = std::uniform_int_distribution<>(0,19);

group.dis.param(std::uniform_int_distribution<>::param_type(0,19));

另一种方法是在struct

中添加一个方法
struct group_s {
    int k;
    std::uniform_int_distribution<> dis;
    void set(int a, int b) { dis = std::uniform_int_distribution<>(a,b); }
} group;


group.set(0,19);

答案 2 :(得分:0)

你应该做

group.dis = std::uniform_int_distribution<>(0,19);

而不是

group.dis(0,19);

此外,您的代码似乎是在没有直接引用here的情况下拍摄的,因此链接作为一种支流引用会有序。