轮盘赌选择与SQL查询
-
19-09-2019 - |
题
我实现一个轮盘赌选择,我想保持尽可能多的代码可以在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
在问题)的值时,项A
,B
,和C
示与它们各自的选择的机会。加入所有的这件事会给A
,B
和C
的组合概率为2 / 18ths,5 / 18ths和11 / 18ths。
这是从轮盘赌不同,在讨论中的查询似乎偏压较大的权重。因此,要回答我的问题,查询反映轮盘赌,但不匹配的。
这使我怀疑,如果你在一个特定的非线性分布拿起过滤器,可你还是让这个查询不仅镜,但比赛轮盘赌?而且那会是什么分布?
不隶属于 StackOverflow