Получить взвешенную случайную выборку из набора данных

Итак, у меня есть ВВП для 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 стран, причем страны с наибольшим ВВП будут взвешиваться благоприятно, а страны с наименьшим ВВП весят меньше.

Я использую эту функцию ($ values ​​и $ weights — 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 NLD CHN США США
FRA США TUR GBR CHN BRA США BEL JPN США TUR RUS DEU США ТА США США
DEU AUS CHL CHN MEX США США CHN PRT SAU ITA IND США RUS IND AUS ESP
США KOR CHN США JPN США IDN США CHN FIN США JPN PRT США AUS США JPN
США США США CHN JPN THA CHN TUR CHN FRA США США MEX GBR CHN

США и CHN выходят слишком часто!

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

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

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

1

Решение

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]