指定范围的随机数的std :: discrete_distribution

时间:2017-05-26 22:53:55

标签: c++ c++11 random c++14

我知道我可以这样使用std::discrete_distribution

std::default_random_engine generator;
std::discrete_distribution<int> distribution {2,2,1,1,2,2,1,1,2,2};

int p[10]={};

for (int i=0; i<100; ++i) {
    int number = distribution(generator);
    ++p[number];
}

然而,这将根据指定的重量生成0-9范围内的数字。

如何在用户指定的范围内生成数字,例如24-33或95-104等,但仍然使用discrete_distribution中指定的分布?

2 个答案:

答案 0 :(得分:5)

您只需将24或95添加到生成的数字即可。在开头你有0到9之间的数字,当你向它们添加24时,你有24到33的数字。

答案 1 :(得分:-3)

当你有一个函数返回范围[r1,r2)中的随机数时,你需要[min,max)数学帮助。

首先我们计算d=(max-min)/(r2-r1),然后我们将范围[r1,r2)乘以d,这样我们得到[d*r1,d*r2)我们将[r1',r2'),现在您计算diff=abs(min-r1)' 1}}并将其与[r1',r2')范围相加,我们使用了abs因为我们想要没有符号的差异,而我的朋友会得到你想要的范围,让我们假设这个功能在[r1,r2)范围内返回的是somerand(),然后是:

const int r1=0,r2=9
int myrand(const int min,const int max){
    const int d=(max-min)/(r2-r1);
    const int localrand=d*somerand();
    return localrand + abs(min - d*r1);
}

min返回somerand()时,您可以检查该函数是否返回r1,当max返回somerand()时,您的函数会返回r2

上述解决方案无法使用,例如:r1 = 0,r2 = 2,min = 0,max = 3,简而言之max-min应该可以被r2-r1整除。