我实现一个轮盘赌选择,我想保持尽可能多的代码可以在SQL。我的尝试已经取得了下面的查询。 $ 1是我体重发送到SQL代码的同一范围内的随机变量(目前还不清楚如何使随机的()只调用一次)。重量是该行的对轮槽的大小。随机()是一个SQLITE函数返回一个随机数。这里是在充分的查询:

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

我的问题是,这是仍轮盘?基本算法将要求所有的权重的总和,然后挑选范围0..sum的随机值 - 这将决定选择哪一行。代替此例程第一滤波器满足一个随机数的所有行,则加扰它们的顺序并挑选第一

一个微妙的变化是使用$ 1,而不是第二呼叫到随机()。这可能使例程更公平,但我不能确定它 - 这将意味着,每行被赋予它自己的机会被过滤或不

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

有帮助吗?

解决方案

我只是想的一件事是,这是因为例如这个简单的证明不是轮盘赌:

如果你有三个项目,每个权重的一个,两个和三个中的一个,然后轮盘会选择将它们与1/6日,2 / 6ths和3 / 6ths概率。然而,我的日常会偏向较高的权重:

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

上面可以看到,对于每个filter$1在问题)的值时,项AB,和C示与它们各自的选择的机会。加入所有的这件事会给ABC的组合概率为2 / 18ths,5 / 18ths和11 / 18ths。

这是从轮盘赌不同,在讨论中的查询似乎偏压较大的权重。因此,要回答我的问题,查询反映轮盘赌,但不匹配的。

这使我怀疑,如果你在一个特定的非线性分布拿起过滤器,可你还是让这个查询不仅镜,但比赛轮盘赌?而且那会是什么分布?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top