我知道我可以这样使用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中指定的分布?
答案 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
整除。