根据概率挑选随机项目

Fiz*_*uzz 7 c random probability

我知道,有一个类似的问题,但它使我感到困惑,所以我认为以我的方式提问更容易.

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

Ste*_*sop 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
Run Code Online (Sandbox Code Playgroud)

累积概率定义为直到该点的所有概率的总和.

现在,从您的随机数生成器,您需要一个介于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),并且仍然满足您的要求,即"价值越高,越高的可能性".