【发布时间】:2015-03-06 03:46:29
【问题描述】:
有一个带有 ID 和这些 ID 权重的哈希。
y = { 1 => 0.7, 2 => 0.2, 3 => 0.1 }
我想根据权重打乱这个哈希。
我尝试了许多不同的方法,所有这些方法都给了我类似的、意想不到的结果。这是我找到的最简洁的。
y.sort_by {|v| -v[1]*rand()}
当我运行这个一万次并挑选出第一个 ID 时,我得到以下计数:
{1=>8444, 2=>1316, 3=>240}
我希望这些计数能够反映上述权重(例如,1 => 7000)。对于为什么这种洗牌与这些权重不匹配,我有点困惑。有人能解开我的困惑并告诉我如何解决吗?
以下是我找到的一些有用的资源:
【问题讨论】:
-
这个不会工作的例子。假设我们有哈希
{ 1 => 0.7, 2 => 0.3}。当我们为 1 选择随机权重时,恰好 4/7 的时间它会大于 0.3,因此肯定大于我们为 2 选择的数字。另外 3/7 的时间,它将是随机的介于 0.0 和 0.3 之间,并且有 1/2 的机会大于我们为 2 选择的数字。所以它在时间上首先被订购4/7 + (3/7)*(1/2) == 78.6%,而在 70% 的时间里应该首先订购它。 -
你需要做的是构造一个(累积的)分布函数,然后让
rn = rand(0.0和1.0之间的一个数字),如果rn < 0.7选择1,2 if 0.7 <= rn < 0.9和3如果 rn