2014-09-26 120 views
1

所以我对前50名世界各国的国内生产总值:得到一个加权随机抽样

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最小的国家加权较少。

我使用这个函数($值$和权重是在上述数据的第1和第2列 - 解析未显示)

/** 
* 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元话费:

CHN GBR ITA美国ESP MEX ZAF CAN JPN ITA COL美国美国FRA USA CHN美国 IND ESP MEX CHN JPN美国美国CAN申美国美国美国JPN NLD CHN美国USA FRA美国TUR GBR CHN BRA美国BEL JPN美国TUR RUS DEU美国THA美国美国 DEU AUS CHL CHN MEX美国U SA CHN PRT SAU ITA IND美国RUS IND AUS ESP 美国KOR CHN美国JPN美国IDN USA CHN FIN美国JPN PRT美国AUS美国JPN 美国美国美国CHN JPN THA CHN TUR CHN FRA美国美国MEX GBR CHN

美国和中国经常出现!

有没有办法来调整呢?

任何人都可以指向正确的方向吗?

我在PHP中编写了所有这些代码。

+1

如果不知道具体的最终目标是什么,很难说。主要国家出现的频率如何?我认为你需要考虑你正在寻找的适当的数学近似值,然后在代码中实现它。 – 2014-09-26 15:34:06

+0

可能[解决方案](http://stackoverflow.com/questions/3153534/i-need-random-algorithm-with-weighing-options-in-net)。问题是.Net,但答案中提供的算法可以应用于任何语言。 – Grice 2014-09-26 15:39:32

+0

@MikeBrant我想要一个体重参数,这样我就可以调整自己的口味。 – Eamorr 2014-09-26 15:51:27

回答

1

最简单的方法是动态调整权重,例如采取初始权重并乘以呼叫号码迭代后的呼叫数,因为该国已被呼叫。那么只需按wieghted顺序对列表进行排序即可。因此,例如,根据这些国家排队等待的时间长短,美国将转移到较小的GDP国家之下。