Mysql,来自城市表的随机人群

时间:2018-03-20 14:58:25

标签: mysql sql math

我有一张桌子,上面有世界上所有城市和人口。而且我希望在城市人口中找到一个随机的人。

我做到了:

SELECT city_name FROM cities ORDER BY population * RAND() DESC;

我把100k用户放在另一张桌子后。我看到他们几乎只是来自大城市。小城市没有任何机会。

我在这里向一个数学家展示,他说我做错了,我应该使用:

SELECT city_name FROM cities ORDER BY -LOG(1-RAND()) / population ASC;

他的方式完美无缺!

我说“啊好”,但真的是......我不明白为什么!

你能解释一下为什么吗?

1 个答案:

答案 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多。倍数只会使其更有可能。而相反,分割将使分配更加平衡