Получить взвешенную случайную выборку из набора данных
Итак, у меня ВВП для 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://stackru.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 ответ
Самый простой способ - динамически регулировать вес, например, взять начальный вес и умножить его на число итераций вызовов, так как эта страна была вызвана. затем просто отсортируйте список по порядку. Так, например, США будут перемещены ниже стран с меньшим ВВП в зависимости от того, как долго эти страны ждали в очереди