mysql随机取一条数据算法中各条数据出现的概率不平衡

发布于 2022-09-05 23:10:43 字数 349 浏览 19 评论 0

网上好几个经典示例,一般都用rand()函数,此处用其中一列说明

SELECT * FROM user where user_id >= ((SELECT MAX(user_id) FROM user)
-(SELECT MIN(user_id) FROM user)) * RAND() 
+ (SELECT MIN(user_id) FROM user)  LIMIT 1

当rand()获取的0和1 这2个极端随机数后,查询语句的结果才会显示出第一条和最后一条数据,假如有4条数据,这4条数据出现的概率并不是各25%(由于出现0/1几率较小,一般都是0.**),例如对抽奖算法中,对第一个参与者非常不公平

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

日记撕了你也走了 2022-09-12 23:10:43

这种事情不应该是业务层做吗……

直接按算法选出一个id再读数据库吧……

抱猫软卧 2022-09-12 23:10:43

你的这个随机的逻辑有问题。首先它会依赖于user_id本身的分布。举个极端的例子,你有101个user_id,分别是:1,2,3,.... 100, 10000。那么按照min + (max - min) * rand的逻辑,绝大部分机会都给了10000。其次你limit的用法也不对。

其实一条

select * from user order by rand() limit 1

就好了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文