2010-10-23 53 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