具有动态概率的加权随机选择

时间:2016-03-11 17:58:06

标签: arrays algorithm random

我一直在寻找一种很好的算法,用于从具有不同加权概率的对象列表中选择一个随机对象,并且找到了一个真正的可能性,从将每个对象放入一个数组 n 次,对包含离散累积密度函数(CDF)的数组执行二进制搜索,将CDF放入存储桶,以及一些更令人困惑的响应,尤其是Weighted random selection from array的礼貌。

但是这些回应似乎都集中在进行随机选择的效率上,而不是动态建立或调整权重的成本。由于我的应用程序似乎可能需要在运行时调整权重几乎与选择一样频繁,因此允许动态调整概率权重的最有效算法是什么?将新对象添加到列表中可能只会在初始化时完成,但删除对象可能比仅更改值更少(可能将概率设置为零就足够了)。

我最初的印象是使用一系列CDF是我最好的选择;在目标概率被应用之后对所有内容应用相同的调整似乎微不足道,但是我没有看到任何对于CDF桶来说如此容易的事情。有任何想法吗?

如果有人关心,我正在用haxe实现这一点。

1 个答案:

答案 0 :(得分:0)

假设你有对象数组{O.1,O.2,...,ON}和一组相关的概率权重{w.1,w.2,...,wN}

您可以设置0到1之间的值范围(“桶”),这些值根据每个权重调整大小,然后只选择0到1之间的随机值(均匀分布)。随机值将落入你定义的其中一个桶。如果它落在第i个桶中,则从阵列中选择第i个对象。

抱歉,我不知道haxe,但这里有一些java代码来说明:

$('#despatchEntryDetails').dataTable({
        "responsive": true,
        "autoWidth": false,
        "columns": [
            { "title": "Numéro" },
            { "title": "Date création" },
            { "title": "Sujet" },
            { "title": "Etat" },
            { "title": " ",  
              "width": "32px", 
              "orderable": false, 
              "data": null,
              "className": "dt-body-center",
              "defaultContent": '<input name="submit" id="viewDetail" type="image" src="btn_vuedetail.gif" onclick="viewDetail();" />',
            }       
        ],
        data: dataSet
    });
  });