我想基于已知的分布在C ++中生成一个随机数。
这是问题所在。我掷了一个骰子(比如说)6次,我记录了4次4次,1次1次,2次2次。 因此,4 = 3/6,一个= 1/6,两个= 2/6
是否有可以使用的库函数根据上述分布生成随机数?
如果没有,您认为仅仅做
对我有效int i= ran()%5;
if (i is in the range of 0 to 2)
{
//PICK FOUR
}
else if (i is in the range of 3 to 4)
{
// PICK ONE
}
else
{
// PICK TWO
}
答案 0 :(得分:4)
int pick()
{
static const int val[6] = { 4,4,4,1,2,2 };
return val[ran()%6]; // <---- note %6 not %5
}
修改注意ran() % 6
可能会也可能不会均匀分布,即使ran()
也是如此。你可能想要保证均匀分布的东西,例如:
std::random_device device;
std::default_random_engine engine(device());
std::uniform_int_distribution<int> dist(0, 5);
现在dist(engine)
是ran()%6
的良好替代品。
Edit2 根据评论中的建议,这里的版本基于std::discrete_distribution
:
std::random_device device;
std::default_random_engine engine(device());
std::discrete_distribution<> dist ({1, 2, 0, 3, 0, 0});
int pick()
{
return dist(engine) + 1;
}