【问题标题】:Picking random row with certain chance (weight) in MySQL在 MySQL 中以一定的机会(权重)选择随机行
【发布时间】:2014-04-27 15:44:26
【问题描述】:

我搜索了一段时间,但结果让我很困惑,因为我对 MySQL 还很陌生。

我有一个包含这 4 列的表:AUTO_INCREMENT ID, NAME, TYPE, CHANCE,所以行看起来像这样:

1, NOTHING, NO, 35
1, VERSICOLOR, TREE, 35
3, DIVERSIPES, TREE, 35
4, AMAZONICA, TREE, 35
5, EMILIA, GROUND, 25
6, BOEHMI, GROUND, 25
7, SMITHI, GROUND, 25
8, METALLICA, SKY, 5
9, REGALIS, SKY, 5

注意:这些都是简单的例子,会有 x100 喜欢它们。我需要做的是从该表中选择一行,机会如CHANCE 列所示。

意义;我需要从其中的 9 行中选择一行,结果可以是“VERSICOLOR、DIVERSIPES、AMAZONICA 或 NOTHING 有 35% 的机会”或“EMILIA、BOEHMI 或 SMITHI 有 25% 的机会”或“METALLICA 或 REGALIS 有 %5 的机会”。所以这个查询可能会给我“VERSICOLOR、DIVERSIPES、AMAZONICA 或 NOTHING”的结果,因为它有 35% 的机会,或者我很幸运,我会得到“METALLICA 或 REGAIS”:)

基本上有 3 组类型,GROUND、TREE 和 SKY。我想做的是从所有这些中只得到一个结果。 GROUND、TREE 或 SKY 类型的项目有一定的机会,但可以确定的是,我不想要每个组一个,我只想要一个结果,它可以是 GROUND、TREE 或 SKY 类型的项目。 我希望我确实解释了自己。问候。

【问题讨论】:

    标签: mysql random


    【解决方案1】:

    可能有一个更优雅的解决方案,并且不假设您的百分比相加为 100 - 但这可能有效:

    例如http://sqlfiddle.com/#!2/ec699/1

    SELECT *
    FROM (
      SELECT id, name, type, chance
        , @value + 1 AS lowval
        , @value := @value + chance AS hival
      FROM tbl
      JOIN (SELECT @value := 0) AS foo) AS bar
    JOIN (SELECT FLOOR(1 + RAND()*99) AS guesser) AS bar2
      ON guesser  BETWEEN lowval and hival;
    

    【讨论】:

    • 我试图更具体。我尝试了您的建议,但是当您将选项相乘时它不起作用。请再次检查问题,我做了一些更正。
    【解决方案2】:

    这个问题出现在 SQL 之外。我在这里发布了一个通用的解决方案,generate random numbers within a range with different probabilities

    使用您使用的第一组数字(70%、25%、5%),分别用 100 个球填满三个瓮。瓮 0 所有球都是红色的。瓮 1 75 个球是绿色的,25 个球是红色的。最后,缸 2 将有 15 个蓝球和 85 个红球。现在随机挑选一个瓮,每个都有 1/3 的概率,然后随机挑选一个球。使用该方案得到红球的概率为0.75,绿球的概率为0.25,蓝球的概率为0.05。

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2010-11-19
      • 2012-06-24
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 2011-04-29
      • 2012-02-05
      相关资源
      最近更新 更多