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