我遇到了一个问题:我有一个包含字段(float Fitness
)的元素的列表或数组(IList)。我需要根据这个变量有效地选择N个随机唯一元素:越大 - 选择它的可能性越大。
我在互联网上搜索,但我发现的算法相当不可靠。
答案陈述here似乎在开始时有更大的可能性,我需要确保避免。
- 编辑 -
例如,我需要选择值为[-5,-3,0,1,2.5]的对象(包括负值)。
答案 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 。