在使用 random.choices
函数时,如果传递的权重列表 cum_weights
是递减的,可能会导致函数总是返回相同的元素。这是因为 random.choices
函数在计算累积权重时,依赖于权重的相对大小,而不是绝对值。
random.choices
函数通过累积权重来决定选择哪个元素。如果权重列表是递减的,累积权重的计算可能会导致某些元素的累积权重始终大于其他元素,从而使得这些元素被选中的概率更高。为了避免这个问题,可以确保权重列表是递增的,或者在传递权重列表之前对其进行预处理。
import random
weights = [0.1, 0.3, 0.2, 0.4]
cum_weights = []
cumulative_sum = 0
for weight in weights:
cumulative_sum += weight
cum_weights.append(cumulative_sum)
# 确保累积权重列表是递增的
assert all(cum_weights[i] <= cum_weights[i+1] for i in range(len(cum_weights)-1))
selected_element = random.choices(range(len(weights)), cum_weights=cum_weights)[0]
print(selected_element)
import random
weights = [0.1, 0.3, 0.2, 0.4]
cum_weights = [sum(weights[:i+1]) for i in range(len(weights))]
# 确保累积权重列表是递增的
assert all(cum_weights[i] <= cum_weights[i+1] for i in range(len(cum_weights)-1))
selected_element = random.choices(range(len(weights)), cum_weights=cum_weights)[0]
print(selected_element)
通过上述方法,可以确保 random.choices
函数在传递递减值的权重列表时,能够正确地选择元素,避免总是返回相同的元素。
领取专属 10元无门槛券
手把手带您无忧上云