2010-10-23 56 views
1

有很多關於加權隨機的SO問題,但所有這些問題都依賴於最高數目的偏差。我想偏向最低點。隨機選擇加權最低

我現在的算法是隨着偏向於更高值而隨機加權的。

double weights[2] = {1,2}; 
double sum = 0; 
for (int i=0;i<2;i++) { 
    sum += weights[i]; 
} 
double rand = urandom(sum); //unsigned random (returns [0,sum]) 
sum = 0; 
for (int i=0;i<2;i++) { 
sum += weights[i]; 
if (rand < sum) { 
    return i; 
} 
} 

我怎麼能轉換這偏向較低的價值?即我想在100個樣本中,權重[0]樣本被選擇66%的時間;和33%的時間(即它們現在的倒數)加權[1]。進行全方位


手例如參考文獻總和 - 權重[X]溶液

Original: 
1 | 1 | 1% 
20 | 21 | 20% 
80 | 101 | 79% 

Desired: 
1 | ? | 79% 
20 | ? | 20% 
80 | ? | 1% 

Now sum - weights[i] 

100(101 - 1) | 100 | 50% 
81(101 - 20) | 181 | 40% 
21(101 - 80) | 202 | 10% 
+0

哦。 :-(哎呀,我應該通過更仔細的方式做到這一點 – Omnifarious 2010-10-23 08:59:32

回答

1

這樣如何:

template<typename InputIterator> 
vector<int> generateWeightMap(InputIterator first, InputIterator last) 
{ 
    int value = 0; 
    vector<int> weightMap; 
    while(first != last) 
    { 
     while((*first)-- > 0) 
      weightMap.push_back(value); 
     ++first; 
     value++; 
    } 
    return weightMap; 
} 
...later 

int weights[] = {1,19,80}; 
vector<int> weightMap = generateWeightMap(weights, weights + 3); 

int weighted_random = weightMap[urandom(weightMap.size())]; 
+0

謝謝,但我只是決定用1/x。{1,2,3},它給出{50%,33%,16%} ......這是我想要的,主要關注的是速度,所以內存分配是我想盡我所能避免的。 – dcousens 2010-10-23 05:56:46