我正在寻找一种解决方案,以幸运率获取一个或多个条目。我会尽力解释。
我有一个看起来像这样的表:
+-------------------+---------------------+
| Username(varchar) | Subscriber(boolean) |
+-------------------+---------------------+
| Tobi | 1 |
| Maik | 0 |
| Jelly | 0 |
| Arthur | 1 |
+-------------------+---------------------+
例如我说幸运率为 3,那么 subscriber 值为 1 的人应该比值为 0 的人被选中高 3 倍。
最佳答案
如果我没理解错的话,你想选择一行,“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。问题是:第二个“获胜”的频率是多少?这就是“幸运率”。
嗯,当第二个大于 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
关于mysql - 获得具有幸运率的随机条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27851332/