轮盘赌选择与SQL查询

时间:2009-08-20 11:39:33

标签: sql algorithm sqlite roulette-wheel-selection

我正在实施轮盘赌选择,我想在SQL中保留尽可能多的代码。我的尝试已经产生了下面的查询。 $ 1是与我发送给SQL代码的权重相同范围的随机变量(不清楚如何只调用random()一次)。重量是车轮上行的槽的大小。 random()是一个返回随机数的SQLITE函数。这是完整的查询:

SELECT id
FROM items
WHERE weight >= $1
ORDER BY random()
LIMIT 1

我的问题是,这仍然是轮盘赌?基本算法需要所有权重的总和,然后选择范围0..sum的随机值 - 这将确定选择哪一行。相反,此例程首先过滤满足一个随机数的所有行,然后对其顺序进行加扰并选择第一个。

一个微妙的变化是使用$ 1而不是第二次调用random()。这可能会使例程变得更公平,但我不确定它是否会这样做 - 这意味着每行都有自己被过滤的机会。

所以,我想我问这个镜子轮盘赌有多少,因为它显然遵循不同的步骤。但它是否反映了结果呢?

1 个答案:

答案 0 :(得分:1)

我刚才想到的一件事是,这不是轮盘赌轮因为这个简单的证明:

如果您有三个项目,每个重量分别为1,2和3,那么轮盘赌轮将以1/6,2/6和3/6的概率选择它们。但是,我的惯例会偏向更高的权重:

Filter, A  ,   B,   C
  1   , 1/3, 1/3, 1/3
  2   , 0  , 1/2, 1/2
  3   , 0  , 0  , 1

在上方,您可以看到filter(问题中$1)的每个值,项ABC显示各自的选择机会。添加所有这些将使ABC的组合概率为2 / 18th,5 / 18th和11 / 18th。

这与轮盘赌轮不同,问题中的查询似乎偏向较大的权重。所以要回答我自己的问题,查询会反映轮盘赌轮,但与之不符。

这让我想知道你是否选择了特定非线性分布的过滤器,你是否仍然可以使这个查询不仅镜像而且匹配轮盘赌?它的分布是什么?