代码之家  ›  专栏  ›  技术社区  ›  hiddensunset4

随机选择最低权重

  •  1
  • hiddensunset4  · 技术社区  · 14 年前

    在加权随机数上有很多这样的问题,但所有这些问题都依赖于最大数的偏差。我想偏向最低的。

    目前我的算法是随机加权的,偏向于更高的值。

    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、Ref和权[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%
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Benjamin Lindley    14 年前

    这个怎么样:

    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())];