关于加权随机性有很多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%的时间内被选择;和权重[1] 33%的时间(即它们现在的倒数)。
Omni的手动示例,参考总和 - 权重[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 :(得分: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())];