2014-09-26 117 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國家之下。