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

网上好几个经典示例,一般都用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.**),例如对抽奖算法中,对第一个参与者非常不公平

阅读 4.4k
2 个回答

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

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

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

其实一条

select * from user order by rand() limit 1

就好了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题