Php 从数据集中获取加权随机样本

Php 从数据集中获取加权随机样本,php,random,sampling,random-sample,Php,Random,Sampling,Random Sample,因此,我有世界前50个国家的GDP: USA,16800000,1 CHN,9240270,2 JPN,4901530,3 DEU,3634823,4 FRA,2734949,5 GBR,2521381,6 BRA,2245673,7 RUS,2096777,8 ITA,2071307,9 IND,1876797,10 CAN,1826769,11 AUS,1560597,12 ESP,1358263,13 KOR,1304554,14 MEX,1260915,15 IDN,868346,16

因此,我有世界前50个国家的GDP:

USA,16800000,1
CHN,9240270,2
JPN,4901530,3
DEU,3634823,4
FRA,2734949,5
GBR,2521381,6
BRA,2245673,7
RUS,2096777,8
ITA,2071307,9
IND,1876797,10
CAN,1826769,11
AUS,1560597,12
ESP,1358263,13
KOR,1304554,14
MEX,1260915,15
IDN,868346,16
TUR,820207,17
NLD,800173,18
SAU,745273,19
CHE,650377,20
ARG,611755,21
SWE,558949,22
NGA,521803,23
POL,517543,24
NOR,512580,25
BEL,508116,26
VEN,438284,27
AUT,415672,28
THA,387252,29
ARE,383799,30
COL,378148,31
IRN,368904,32
ZAF,350630,33
DNK,330614,34
MYS,312435,35
SGP,297941,36
ISR,291357,37
CHL,277199,38
HKG,274013,39
PHL,272017,40
EGY,271973,41
FIN,256842,42
GRC,241721,43
PAK,236625,44
KAZ,224415,45
IRQ,222879,46
PRT,220022,47
IRL,217816,48
DZA,210183,49
QAT,202450,50
格式:ISO代码、GDP、排名

资料来源:世界银行

我想每60秒对名单上的每个国家进行一次分析。但是我不能——我使用的Twitter API是有速率限制的

因此,我将随机选择50个国家中的15个,其中GDP最多的国家的权重是有利的,而GDP最少的国家的权重则较低

我正在使用这个函数,$values和$weights是上述数据中的第一列和第二列-解析未显示

/**
* getSample()
* Pick a random item based on weights.
*
* @param array $values Array of elements to choose from 
* @param array $weights An array of weights. Weight must be a positive number.
* @return mixed Selected element.
* http://stackoverflow.com/questions/445235/generating-random-results-by-weight-in-php
*/
function getSample($values,$weights){ 
    $count = count($values); 
    $i = 0; 
    $n = 0; 
    $num = mt_rand(0, array_sum($weights)); 
    while($i < $count){
        $n += $weights[$i]; 
        if($n >= $num){
            break; 
        }
        $i++; 
    } 
    return $values[$i]; 
}
我从100个电话中得到这样的输出:

中国GBR ITA USA ESP MEX ZAF可以在美国COL USA FRA USA CHN USA 工业ESP MEX CHN JPN USA可以DEU USA JPN NLD CHN USA FRA USA TUR GBR CHN BRA USA BEL JPN USA TUR RUS DEU USA THA USA 中国大陆美国大陆中国大陆美国大陆中国大陆美国大陆 美国KOR CHN USA JPN USA IDN USA CHN FIN USA JPN PRT USA AUS USA JPN 美国CHN JPN THA CHN TUR CHN FRA USA MEX GBR CHN

美国和中国太频繁了

有没有办法调整这个

谁能给我指出正确的方向吗


我正在用PHP编写所有这些代码。

最简单的方法是动态调整权重,例如,取初始权重,乘以该国家被调用后的调用迭代次数。然后简单地按wieghted顺序对列表进行排序。因此,例如,根据那些国家排队等候的时间长短,美国将被排在GDP较小的国家之后

很难说不知道你心目中的具体最终目标是什么。顶级国家应该多久出席一次?我认为您需要考虑您正在寻找的适当的数学近似,然后在代码中实现它。问题是.Net,但答案中提供的算法可以应用于任何语言。@MikeBrant我想要一个权重参数,以便根据自己的喜好调整它。