从数据库中随机(按权重偏差)选择行?

3

可能是重复问题:
MySQL:选择随机条目,但倾向于某些条目

我有一个表,我想能够从中随机选择一个用户,但在这个表中,我有一个'Entries'列。 我已经能够随机选择一个用户,但现在我正在尝试考虑他们的条目数(条目数越高,他们获胜的可能性就越大)。 我该怎么做?

我的表看起来像:

FN   | LN    | ENTRIES
Bob  | Smith | 20
John | Doe   | 3

谢谢您的帮助!

1
如果某人被选中的机会更大,那么这并不真正是随机的。 - Hunter McMillen
请查看此线程:https://dev59.com/rU3Sa4cB1Zd3GeqPu2z1 - Salvatore Previti
3
@Hunter:是的,它确实存在,只是分布不均匀。 - Karoly Horvath
1个回答

1

为了给它们赋权值,将 rand() 乘以 entries 列。

select * from table order by entries*rand() desc limit 1; 

1
值得一提的是,对于大表来说,这种方法非常慢,因为它必须为表中的每一行生成一个随机数。 - Vincent Savard
是的,我误读了问题并编辑了我的先前评论。 - Vincent Savard
@user790068:这是可以预料的。在升序中,较低的值将先被选择。您需要在entries*rand()之后添加DESC关键字。 - Mchl
@user 你的意思是想在表格中随机化行数吗? - Stephen
1
这会导致分布严重失衡。比如说有98行权重为1,只有1行权重为2。RAND()将生成一个介于0和1之间的数字,因此50%的时间该数字将大于0.5。对于权重为2的行,(RAND()*2)将在50%的时间内大于1。这比所有(RAND()*1)的结果都要大,因此权重为2的行至少会被选中50%的时间。实际上,它应该被选中2%的时间(2/100)。 - Arth
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接