如何从反向加权列表中随机选择?

时间:2011-10-14 02:50:08

标签: algorithm language-agnostic

给出一个整数列表,例如1, 2, 3, 4,我知道如何根据体重选择项目。示例项目的概率分别为10%,20%,30%和40%。

是否有同样简单的方法根据体重的倒数选择项目?使用此方法,示例列表将等于1, 1/2, 1/3, 1/4的加权列表(48%,24%,16%,12%),但我希望避免转换和使用浮点算法。 (假设所有整数都是正数且非零。)

2 个答案:

答案 0 :(得分:3)

您可以将数字'least common multiple除以每个数字,然后得到整数比例。

对于[1, 2, 3, 4],这是12.你的权重是12/1 = 12,12 / 2 = 6,12 / 3 = 4,12 / 4 = 3.

您也可以将它们全部加在一起,而不是理解LCM。数字会更高,但比例相同:24/1 = 24,24 / 2 = 12,24 / 3 = 8,24 / 4 = 6.

答案 1 :(得分:0)

首先得到权重之和,称之为S(例如1 + 1/2 + 1/3 + 1/4 = 2.083)。然后,为了找到权重w_i的概率,您将w_i除以S(例如1/2.083 = 48%

对于一般数字序列,我认为这个表达式没有一个很好的,封闭形式的公式。

权重之和为harmonic numbers。对于大n,总和收敛到ln(n)+gamma,其中gamma是Euler-Mascheroni常数(~0.577)。因此,对于较大的n,您可以使用此公式来估算总和。

编辑:有一些方法可以减少浮点错误。一种这样的方法是计算从最小项到最大项的总和(例如1/n + 1/(n-1) + ... + 1)。这允许中间计算最大化精度位数。通过这样做,舍入问题应该不是问题。