我正在实现一个轮盘赌选择,我想保留尽可能多的代码在sql中。我的尝试产生了下面的问题。$1是一个随机变量,其范围与我发送给sql代码的weight相同(不清楚如何使random()只调用一次)。重量是轮盘上一排槽的大小random()是返回随机数的SQLITE函数以下是完整的查询:
SELECT id
FROM items
WHERE weight >= $1
ORDER BY random()
LIMIT 1
我的问题是,这还是轮盘赌吗?基本算法需要对所有权重求和,然后选取0..sum范围内的随机值——这将确定选择了哪一行相反,这个例程首先过滤满足一个随机数的所有行,然后扰乱它们的顺序并选择第一行。
一个微妙的变化是使用$1而不是第二次调用random()。这可能会使例程更公平,但我不确定它是否公平--这意味着每一行都有自己的机会被过滤或不被过滤。
所以,我想我是在问这个镜子轮盘赌多少钱,因为它显然遵循不同的步骤但它是否反映了结果?
最佳答案
我刚才想的一件事是,这不是轮盘赌,因为这个简单的例子证明:
如果你有三个项目,每一个重量一,二和三,那么轮盘赌轮将选择他们的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/18,5/18和11/18。这与轮盘赌不同,查询中的问题似乎偏重较大的权重所以为了回答我自己的问题,这个查询反映了轮盘赌,但并不匹配。
这让我想知道,如果您选择了一个特定的非线性分布的过滤器,您是否仍然可以使这个查询不仅镜像,但匹配轮盘赌轮那会是什么样的分配呢?