我正在寻找一个以幸运率获得一个或多个条目的解决方案。我会尝试解释一下。
我有一个看起来像的表:
+-------------------+---------------------+
| Username(varchar) | Subscriber(boolean) |
+-------------------+---------------------+
| Tobi | 1 |
| Maik | 0 |
| Jelly | 0 |
| Arthur | 1 |
+-------------------+---------------------+
例如,我说运气率为3,因此订阅者中价值1的人应该比内有0的人高3倍。
答案 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