1

我正在实施轮盘赌选择,我想在 SQL 中保留尽可能多的代码。我的尝试产生了下面的查询。$1 是一个随机变量,其范围与我发送给 SQL 代码的权重相同(不清楚如何使 random() 只被调用一次)。重量是车轮上行槽的大小。random() 是一个返回随机数的 SQLITE 函数。这是完整的查询:

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

我的问题是,这还是轮盘赌吗?基本算法需要对所有权重求和,然后选择 0..sum 范围内的随机值——这将确定选择哪一行。相反,这个例程首先过滤所有满足一个随机数的行,然后打乱它们的顺序并选择第一个。

一个微妙的变化是使用 $1 而不是第二次调用 random()。这可能会使例程更加公平,但我不确定它是否确实如此——这意味着每一行都有自己的机会被过滤或不被过滤。

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

4

1 回答 1

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) 的每个值,项目ABC都显示了它们各自的选择机会。将所有这些加起来将给出和A的组合概率为2/18、5/18 和 11/18。BC

这与轮盘赌不同,问题中的查询似乎偏向更大的权重。所以回答我自己的问题,查询镜像轮盘,但不匹配。

这让我想知道您是否在特定的非线性分布上选择了过滤器,您是否仍然可以使这个查询不仅镜像而且匹配轮盘赌?它将是什么分布?

于 2009-08-20T12:14:48.710 回答