从列表中随机选择N个唯一元素,给出每个元素的概率

时间:2018-02-07 10:29:07

标签: algorithm

我遇到了一个问题:我有一个包含字段(float Fitness)的元素的列表或数组(IList)。我需要根据这个变量有效地选择N个随机唯一元素:越大 - 选择它的可能性越大。

我在互联网上搜索,但我发现的算法相当不可靠。

答案陈述here似乎在开始时有更大的可能性,我需要确保避免。

- 编辑 -

例如,我需要选择值为[-5,-3,0,1,2.5]的对象(包括负值)。

2 个答案:

答案 0 :(得分:0)

基本算法是对值进行求和,然后从0和(值)和项目的顺序中绘制一个点,并查看它与#34;相交的那个"。

对于值[0.1, 0.2, 0.3]," windows" [0-0.1, 0.1-0.3, 0.3-0.6]将如下所示:

  1 23 456
 |-|--|---|
 |-*--*---|

你绘制一个点[0-0.6],看看它在轴上撞到了什么窗口。

Pseudo-python:

original_values = {val1, val2, ... valn}

# list is to order them, order doesn't matter outside this context.
values = list(original_values)

# limit
limit = sum(values)
draw = random() * limit

while true:
    candidate = values.pop()
    if candidate > draw:
         return candidate
    draw -= candidate

答案 1 :(得分:0)

那么这些数字代表什么呢?

2.5是否意味着所选择的概率是1.25的两倍?嗯 - 负面价值不适合该计划。

我认为健身意味着-5:非常恶心,2.5:非常合适。如果我们知道有多少候选人以及我们是否可以通过索引访问,那么我们有7.5的范围并且可以随机选择一个元素。

然后,取一个-5到2.5之间的随机数,看看我们的数字是否低于或等于候选人的健康状况。如果是这样,候选人被选中,否则我们重复步骤1.我会说,然后我们生成一个新的生存阈值,因为如果我们得到2.5,但没有具有该适应性的候选者,我们将无限搜索。

也必须知道适合范围。

fitnesses [-5, -3,  0,  1, 2.5]
rand -5     x   x   x   x   x 
     -2.5   -   -   x   x   x  
      0     -   -   x   x   x  
      2.5   -   -   -   -   x 

如果每个候选人每轮都要测试,并且-5个人有机会生存,你必须稍微延长随机数的间隔,给他一个机会,例如-6到3 。