根据概率挑选随机项目

时间:2010-05-05 11:51:59

标签: c random probability

我知道有一个similar question,但它让我感到困惑,所以我觉得以我的方式提问更容易。

所以我有一系列价值观,正面和负面。它们越高,被选中的概率就越大。
我实际上无法确定如何分配概率,然后随机选择一个概率。我猜这个数组需要先排序,但之后我就有点迷失了。

3 个答案:

答案 0 :(得分:23)

“我有各种不同大小的咖啡杯。它们越大,我就越想为它们充电。我实际上无法确定如何分配价格”。

这不仅仅是一个编程问题 - 您已经指定概率随值增加,但您没有说 它随着值增加。通常,咖啡店的收费与咖啡量不成正比。你不能按比例分配概率,因为你的一些值是负的,但概率不能是负的。

听起来你需要在编写任何代码之前先解决问题。

如果你真的不在乎概率与价值的关系,除了它们按价值的顺序增加之外,那么一个简单的方法就是:

  • 对您的数组进行排序
  • 将概率1分配给第一个元素,将2分配给第二个元素,依此类推。
  • 现在,你的概率加起来不是1,这是一个问题。因此,将每个概率除以您分配的所有概率的总和:(1 + 2 + .. + n) = n(n+1)/2。这称为“规范化”。

鉴于你的概率列表加起来为1,重复选择一个概率的最简单方法通常是计算累积概率,我将用一个例子来证明:

value (sorted):           -12     -3      127    1000000
assigned probability:     0.1     0.2     0.3      0.4
cumulative probability:   0.1     0.3     0.6      1.0

累积概率定义为到该点的所有概率之和。

现在,从随机数生成器开始,您需要一个介于0和1之间的随机(浮点)值。如果它位于0和0.1之间,则您选择-12。如果它介于0.1和0.3之间,则选择-3,依此类推。要确定它所在的范围,您可以在阵列中线性行走,或者您可以进行二分搜索。

如果需要,可以跳过规范化步骤和浮点数的使用。分配“累积概率”(1,3,6,10 ......),但要理解实际概率是存储的整数值除以n(n + 1)/ 2。然后选择从0到n(n + 1)/ 2 - 1的随机整数。如果它小于1,则选择第一个值,否则如果小于3,则依此类推。这可能会或可能不会使代码更清晰,并且您的RNG可能会或可能不会很好地选择大范围内的整数值。

请注意,您可以指定概率(0.001,0.002,0.003,0.994)而不是(0.1,0.2,0.3,0.4),并且仍然满足您的要求“值越高,概率越高”。< / p>

答案 1 :(得分:2)

一种方法可能是

  • 使所有值为正(将最小值的绝对值添加到所有值)
  • 将值归一化为总和为1(将每个值除以值的总和)

现在可以

从生成的分布中随机化一个值
  • 在[0,1]上选择随机数。
  • 开始对概率求和,直到总和大于或等于随机值。选择该索引作为随机值。

答案 2 :(得分:1)

按照Steve Jessop的建议,在你选择了从0到n(n + 1)/ 2 - 1的随机整数之后,你可以得到三角形根:( - 1 + sqrt((8 * x) )+1))/ 2