【问题标题】:Selecting Randomly Lowest Weighted随机选择最低权重
【发布时间】:2011-04-29 11:32:15
【问题描述】:

有很多关于加权随机的 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 个样本中,有 66% 的时间选择 weights[0] 样本;和权重[1] 33% 的时间(即与现在相反)。


Omni 的示例,参考总和 - weights[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%

【问题讨论】:

  • 哦。 :-( 哎呀,我应该更仔细地考虑一下。

标签: c++ random math


【解决方案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())];

【讨论】:

  • 谢谢,但我只是决定选择 1 / x。使用 {1,2,3},它会给出 {50%, 33%, 16%}... 这可以满足我的需求。一个关键的焦点是速度,所以我想尽可能避免内存分配。
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 2010-09-08
  • 2012-05-20
  • 1970-01-01
  • 2017-12-26
  • 2011-06-05
相关资源
最近更新 更多