“我有各种不同尺寸的咖啡。它们越大,我就越想为它们收费。实际上我很难弄清楚如何分配价格”。
这不仅仅是一个编程问题 - 您已经指定概率随着价值的增加而增加,但您没有说如何它随着价值的增加而增加。通常,咖啡店的收费与咖啡量不成正比。你不能分配与价值成比例的概率,因为你的一些价值是负的,但概率不能是负的。
听起来您需要更深入地解决问题,然后才能编写任何代码。
如果您真的不关心概率与价值的关系,除了它们按价值顺序增加之外,那么一种简单的方法是:
- 对数组进行排序
- 将概率 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),并且仍然满足“值越高,概率越高”的要求。