随机函数发生器C ++

时间:2016-07-06 09:51:28

标签: c++ random

我想基于已知的分布在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
}

1 个答案:

答案 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;
}