2009-08-20 48 views
1

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

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

我的问题是,这仍然是轮盘?基本算法将需要所有权重的总和,然后选取范围0..sum的随机值 - 这将确定选择哪一行。相反,这个例程首先对所有满足一个随机数的行进行过滤,然后对它们的顺序进行扰码并选择第一个。

一个微妙的变化是使用$ 1而不是第二次调用random()。这可能会让日常工作变得更加公平,但我不确定它会如何 - 这意味着每一行都有自己的机会可以被过滤或不被过滤。

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

回答

1

的一件事是,这是因为例如这个简单的证明不是轮盘赌:

如果你有三个项目,每个重的一个,二,三,然后轮盘赌会以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,BC的组合概率为2/18,5/18和11/18。

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

这让我想知道你是否挑选了一个特定的非线性分布的过滤器,你是否仍然可以使这个查询不仅仅是镜像而是匹配轮盘?它会是什么样的分布?

+0

对于没有任何反应,我会解决我自己的研究结果;)(谢谢你看虽然!) – 2009-08-24 13:01:26