假设我有一个大的二维数组,其范围为[0,1],其中0表示“不可能”,1表示“极有可能”。
如何根据上述概率在此数组中选择一组随机点?
答案 0 :(得分:3)
查看问题的一种方法是忽略(暂时)您正在处理2D网格的事实。你拥有的是一组加权项目。从这样一组中随机选择的标准方法是:
s
0 <= u < s
t
t >= u
,请选择您当前正在查看的项目(您刚刚添加其权重的项目)。通过添加以下步骤,可以修改此选项以进行多项选择而无需替换:
每次选择后,从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
}
如果您需要任何特定语言,请问我