如何根据一定的概率获得一个值

时间:2010-08-26 05:46:43

标签: c++ probability probability-theory

我有一些函数可以生成double,float,short,long随机值。我有另一个函数,我传递数据类型,并应返回一个随机值。现在我需要在该函数中选择基于传递的数据类型的返回值。例如,如果我传递float,我需要:

回报是浮动的概率是70%,回报是双倍,短期或长期的概率是10%。我可以调用其他函数来生成相应的随机值,但是如何适应最终返回的概率权重?我的代码是用C ++编写的。

赞赏一些指示。

感谢。

4 个答案:

答案 0 :(得分:4)

C ++随机数有uniform distribution。如果您需要另一个random variablesdistribution,则需要将其数学公式建立在均匀分布上。

如果你的随机变量没有数学公式,你可以这样做:

int x = rand() % 10;
if (x < 7)
{
 // return float
}
else (if x == 7)
{
 // return double
}
else (if x == 8)
{
 // return short
}
else (if x == 9)
{
 // return long
}

答案 1 :(得分:3)

这可以作为未来参考的替代方案 得到精确值的概率,如99.999%或0.0001% 要获得概率(实际百分比),请执行以下操作:

//70%
double probability = 0.7;
double result = rand() / RAND_MAX;
if(result < probability)
   //do something

我已经使用这种方法来创建非常大的渗透网格,它就像精确值的魅力一样。

答案 2 :(得分:2)

我不知道我是否理解你想做什么,但如果你只是想确保概率为70-10-10-10,请执行以下操作:

  • 在(1,2,3,4,5,6,7,8,9,10)
  • 中生成随机数r
  • if r <= 7:float
  • if r == 8:short
  • if r == 9:double
  • if r == 10:long

我认为您认识并且可以使模式适应任意概率值。

答案 3 :(得分:1)

mmonem有一个很好的概率开关,但返回不同的类型也不是微不足道的。你需要一个可以充分(为了你的目的)编码任何值的单一类型 - 检查boost :: any,boost :: variant,union,或转换为最有能力的类型(可能是double),或者字符串表示。