我知道有一个similar question,但它让我感到困惑,所以我觉得以我的方式提问更容易。
所以我有一系列价值观,正面和负面。它们越高,被选中的概率就越大。
我实际上无法确定如何分配概率,然后随机选择一个概率。我猜这个数组需要先排序,但之后我就有点迷失了。
答案 0 :(得分:23)
“我有各种不同大小的咖啡杯。它们越大,我就越想为它们充电。我实际上无法确定如何分配价格”。
这不仅仅是一个编程问题 - 您已经指定概率随值增加,但您没有说 它随着值增加。通常,咖啡店的收费与咖啡量不成正比。你不能按比例分配概率,因为你的一些值是负的,但概率不能是负的。
听起来你需要在编写任何代码之前先解决问题。
如果你真的不在乎概率与价值的关系,除了它们按价值的顺序增加之外,那么一个简单的方法就是:
(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)
一种方法可能是
现在可以
从生成的分布中随机化一个值答案 2 :(得分:1)
按照Steve Jessop的建议,在你选择了从0到n(n + 1)/ 2 - 1的随机整数之后,你可以得到三角形根:( - 1 + sqrt((8 * x) )+1))/ 2