【问题标题】:Roulette Wheel selection with a SQL query使用 SQL 查询进行轮盘赌选择
【发布时间】: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


    【解决方案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 项目都显示了它们各自的选择机会。将所有这些加起来将使ABC 的组合概率分别为 2/18、5/18 和 11/18。

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

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

    【讨论】:

    • 由于没有任何回应,我会用我自己的发现来解决;)(感谢您的关注!)
    猜你喜欢
    • 2018-07-04
    • 2021-06-02
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2012-05-06
    • 2017-11-09
    相关资源
    最近更新 更多