我正在实现一个轮盘赌选择,我想保留尽可能多的代码在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)的每个值,项目ABC都显示了它们各自的选择机会。把所有这些加起来,就会得到ABC的组合概率为2/18,5/18和11/18。
这与轮盘赌不同,查询中的问题似乎偏重较大的权重所以为了回答我自己的问题,这个查询反映了轮盘赌,但并不匹配。
这让我想知道,如果您选择了一个特定的非线性分布的过滤器,您是否仍然可以使这个查询不仅镜像,但匹配轮盘赌轮那会是什么样的分配呢?

10-01 06:44