c - 根据概率选择随机项目

标签 c random probability

有一个 similar question ,我知道,但这让我很困惑,所以我认为用我的方式提问更容易。

所以我有一组值,正值和负值。他们越高,他们被选中的可能性就越大。
我实际上很难弄清楚如何分配概率,然后随机选择一个。我猜想首先需要对数组进行排序,但在那之后我有点迷路了。

最佳答案

“我有各种不同尺寸的咖啡。它们越大,我就越想为它们收取更多费用。我实际上很难弄清楚如何分配价格”。

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

听起来您需要在编写任何代码之前进一步确定问题。

如果您真的不关心概率与值(value)的关系,除了它们按值(value)的顺序增加之外,那么一种简单的方法是:

  • 对你的数组进行排序
  • 为第一个元素分配概率 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,依此类推。要找出它位于哪个范围,您可以线性遍历数组,也可以进行二分查找。

如果需要,您可以跳过规范化步骤和 float 的使用。分配“累积概率”(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),并且仍然满足“值越高,概率越高”的要求。

关于c - 根据概率选择随机项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2772882/

相关文章:

c - strtok() strcat() 意外输出

R : function to generate a mixture distribution

python - 遵循某种概率分布,为给定大小的位串生成转移概率矩阵

data.table 中跨组(不在组内)随机排序

c - 在C语言中,如何从2个中选择将某个东西分配给某个东西?

c - mktime 没有转换为正确的日期,为什么?

C 避免对齐问题

c - 如果只使用第一个元素,我是否必须为整个结构分配内存?

java - 梁 - 正面与反面的游戏

python - 将 Pandas 数据框拆分为互斥的子集