加权随机地图

时间:2011-02-17 10:00:22

标签: algorithm language-agnostic random probability

假设我有一个大的二维数组,其范围为[0,1],其中0表示“不可能”,1表示“极有可能”。

如何根据上述概率在此数组中选择一组随机点?

2 个答案:

答案 0 :(得分:3)

查看问题的一种方法是忽略(暂时)您正在处理2D网格的事实。你拥有的是一组加权项目。从这样一组中随机选择的标准方法是:

  1. 加权,称为总和s
  2. 选择统一随机值0 <= u < s
  3. 遍历这些项目,保持已检查项目的权重总计t
  4. 只要t >= u,请选择您当前正在查看的项目(您刚刚添加其权重的项目)。
  5. 通过添加以下步骤,可以修改此选项以进行多项选择而无需替换:

    • 每次选择后,从s中扣除所选项目的权重(如果您的权重是浮点数且稳定性是个问题,您可能更愿意从头开始重新计算,至少偶尔重新计算)。

    • 从2开始重复,但在步骤3中跳过之前选择过的项目。

    如果将权重相加是不可行的或不可取的(如果您的阵列特别大,则可能是这样),还有其他选择。第一个想到的是拒绝抽样,这是一个相当广泛的话题,所以我只会将你推荐给谷歌和维基百科,因为他们的报道非常好。

    编辑:忘了回到你有一个2D阵列的事实。通过预先计算(MIPMAP风格)地图中区域层次结构的权重总和,您可以显着加快速度,因此您可以快速跳到实际选定权重的位置。

答案 1 :(得分:0)

代码:

  count = 0
  maxPointsInSet = 100
  foreach(point in array){
      if(randomWithChacnce(point.value))) {
         addToSet(point)
         count++
      }
      if(count == maxPointsInSet)
         break;
  }

  function randomWithChacnce(int num){
    random = a randomized number between 0 to 1 // or random from 1 to 100 num*100
    if(num >= random)
     return true;
    return false
  }

如果您需要任何特定语言,请问我