我有一张桌子,上面有世界上所有城市和人口。而且我希望在城市人口中找到一个随机的人。
我做到了:
SELECT city_name FROM cities ORDER BY population * RAND() DESC;
我把100k用户放在另一张桌子后。我看到他们几乎只是来自大城市。小城市没有任何机会。
我在这里向一个数学家展示,他说我做错了,我应该使用:
SELECT city_name FROM cities ORDER BY -LOG(1-RAND()) / population ASC;
他的方式完美无缺!
我说“啊好”,但真的是......我不明白为什么!
你能解释一下为什么吗?
答案 0 :(得分:0)
为了简化任务,假设你有2个城市A有7个人,B有3个人,而且开始顺序是(你可以按任何顺序排列,没关系)
[B,B,B,A,A,A,A,A,A,A]
现在让我们为每个人随机化一个“值”,例如,我用javascript做这个并获得10个数字:
var values = []; for (i=0;i< 10; i++) { values.push(Math.round(Math.random()*100)/100)}
[0.97, 0.34, 0.99, 0.53, 0.16, 0.12, 0.21, 0.17, 0.61, 0.86]
当您使用“ORDER BY值DESC”时,您将获得订单:
[A,A,B,B,A,A,A,B,A,A]
进入前5名,你将获得3A和2B
现在......让多个随机值列表包含总体(* 7表示A,* 3表示B),新值将为:
[2.58,1.83,0.51,6.93,6.79,3.71,2.38,1.47,1.12,0.84]
新订单是:
[A,A,A,B,A,B,A,A,A,B]
前5名:4A和1B现在
所以,正如你所看到的,在没有人口增加的情况下,A在顶部的人数比B多。倍数只会使其更有可能。而相反,分割将使分配更加平衡