我正在实施轮盘赌选择,我想在SQL中保留尽可能多的代码。我的尝试已经产生了下面的查询。 $ 1是与我发送给SQL代码的权重相同范围的随机变量(不清楚如何只调用random()一次)。重量是车轮上行的槽的大小。 random()是一个返回随机数的SQLITE函数。这是完整的查询:
SELECT id
FROM items
WHERE weight >= $1
ORDER BY random()
LIMIT 1
我的问题是,这仍然是轮盘赌?基本算法需要所有权重的总和,然后选择范围0..sum的随机值 - 这将确定选择哪一行。相反,此例程首先过滤满足一个随机数的所有行,然后对其顺序进行加扰并选择第一个。
一个微妙的变化是使用$ 1而不是第二次调用random()。这可能会使例程变得更公平,但我不确定它是否会这样做 - 这意味着每行都有自己被过滤的机会。
所以,我想我问这个镜子轮盘赌有多少,因为它显然遵循不同的步骤。但它是否反映了结果呢?
答案 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
)的每个值,项A
,B
和C
显示各自的选择机会。添加所有这些将使A
,B
和C
的组合概率为2 / 18th,5 / 18th和11 / 18th。
这与轮盘赌轮不同,问题中的查询似乎偏向较大的权重。所以要回答我自己的问题,查询会反映轮盘赌轮,但与之不符。
这让我想知道你是否选择了特定非线性分布的过滤器,你是否仍然可以使这个查询不仅镜像而且匹配轮盘赌?它的分布是什么?