我正在实施轮盘赌选择,我想在 SQL 中保留尽可能多的代码。我的尝试产生了下面的查询。$1 是一个随机变量,其范围与我发送给 SQL 代码的权重相同(不清楚如何使 random() 只被调用一次)。重量是车轮上行槽的大小。random() 是一个返回随机数的 SQLITE 函数。这是完整的查询:
SELECT id
FROM items
WHERE weight >= $1
ORDER BY random()
LIMIT 1
我的问题是,这还是轮盘赌吗?基本算法需要对所有权重求和,然后选择 0..sum 范围内的随机值——这将确定选择哪一行。相反,这个例程首先过滤所有满足一个随机数的行,然后打乱它们的顺序并选择第一个。
一个微妙的变化是使用 $1 而不是第二次调用 random()。这可能会使例程更加公平,但我不确定它是否确实如此——这意味着每一行都有自己的机会被过滤或不被过滤。
所以,我想我是在问这个镜子轮盘赌多少钱,因为它显然遵循不同的步骤。但它反映了结果吗?