获得运气率随机输入

时间:2015-01-08 23:20:29

标签: mysql

我正在寻找一个以幸运率获得一个或多个条目的解决方案。我会尝试解释一下。

我有一个看起来像的表:

+-------------------+---------------------+
| Username(varchar) | Subscriber(boolean) |
+-------------------+---------------------+
| Tobi              |                   1 |
| Maik              |                   0 |
| Jelly             |                   0 |
| Arthur            |                   1 |
+-------------------+---------------------+

例如,我说运气率为3,因此订阅者中价值1的人应该比内有0的人高3倍。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你想选择一行,用" 1"比" 0"更可能是X倍。

以下内容可能与您想要的内容相近:

select t.*
from table t
order by rand() * (case when Subscriber = 0 then 1 else luckrate end) DESC
limit 1;

但是,这个比例并不完全是luckrate。这可能足以满足您的目的。

编辑:

正确的公式似乎是:

order by rand() * (case when Subscriber = 0 then 1 else (1 + luckrate)/2.0 end) DESC

因此,对于" 3",因子为2.此公式适用于luckrate> = 1.它显然不适用于0。

这是公式背后的逻辑。我发现更容易计算出运气好的"对于给定的比例。所以,比例是10.这意味着我们正在比较两个统一的随机分布,一个从0到1,另一个从0到10.问题是:第二个有多少次"胜利&#34 ;?这是"运气好的"。

嗯,当第二个大于1时,它总是胜利。这发生在9/10的时间。其余的时间,它赢得一半的时间(也就是说,10%的时间在0和1之间有两个均匀分布)。因此,获胜的总体概率为90%+ 5%= 95%。反过来,这对应于"运气好的" 19岁。

你可以将其用于其他胜率。您可以执行反向计算以获得上面的公式。但是,此逻辑仅在第二个范围大于第一个范围时才有效(根据问题,这是可以的)。

编辑:

要处理小于1的luckrate,我认为你会进行反演,并将因子应用于0。像这样:

order by rand() * (case when luckrate = 0 then (subscriber <> 0)
                        when luckrate = 1 then 1
                        when luckrate < 1 and subscriber = 1 or
                             luckrate > 1 and subscriber = 0
                        then 1
                        when luckrate < 1 and subscriber = 0
                        then (1 + (1/luckrate)/2.0)
                        when luckrate > 1 and subscriber = 1
                        then (1 + luckrate)/2.0
                   end) DESC