2014-09-26 3 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, ВВП, ранг

Источник: Всемирный банк

Я хотел бы анализировать каждую страну в этом списке каждые 60 секунд. Но я не могу - служба, которую я использую (Twitter API), ограничена ставкой.

Итак, я буду случайным образом выбирать 15 из 50 стран, причем страны с наибольшим весовым коэффициентом взвешивания выгодно, а страны с наименьшим ВВП взвешиваются меньше.

Я использую эту функцию ($ значения и $ вес 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 США CHN США IND ESP MEX CHN JPN США США CAN DEU США США США JPN НЛД CHN США USA FRA США TUR GBR CHN BRA США BEL JPN USA TUR RUS DEU USA THA США США DEU AUS CHL CHN MEX USA U SA CHN PRT САУ ITA IND USA RUS IND AUS ESP США KOR CHN США JPN США IDN США CHN FIN США JPN PRT США AUS США JPN США США США CHN JPN ТНА CHN TUR CHN FRA США США MEX GBR CHN

США и CHN идут слишком часто!

Есть ли способ настроить это?

Может ли кто-нибудь указать мне правильное направление?

Я кодирую все это в PHP.

+1

Трудно сказать, не зная, какую конкретную конечную цель вы имеете в виду. Как часто появляются лучшие страны? Я думаю, вам нужно подумать о правильном математическом приближении, которое вы ищете, а затем реализовать это в коде. –

+0

Возможное [решение] (http://stackoverflow.com/questions/3153534/i-need-random-algorithm-with-weighing-options-in-net). Вопрос .Net, но алгоритм, предоставленный в ответе, может быть применен к любому языку. – Grice

+0

@MikeBrant Мне нужен весовой коэффициент, чтобы я мог настроить его на свой вкус. – Eamorr

ответ

1

Самый простой способ - динамически регулировать вес, чтобы, например, взять начальный вес и умножить его на число итераций вызовов, так как эта страна была вызвана. то просто отсортируйте список по ведомому порядку. Так, например, США будут перемещены ниже меньших стран ВВП в зависимости от того, как долго эти страны ждут в очереди