我有一个数字列表,我试图编写一个函数来选择n个随机索引,我的可能性是百分比[i]
功能:
def choose_randomly(probabilities, n):
percentages = accumulated_s(probabilities)
result = []
for i in range(n):
r = random()
for j in range(n):
if r < percentages[j]:
result = result + [j]
return result
accumulation_s将生成相应的概率列表。
我期待这样的结果:
choose_randomly([1, 2, 3, 4], 2) -> [3 3 0]
choose_randomly([1, 2, 3, 4], 2) -> [1 3 1]
问题是这不会返回n个指标。任何人都可以指出我做错了什么吗? 非常感谢你!
答案 0 :(得分:1)
一旦你找到了合适的概率范围,你就完成了;从内循环中break
生成下一个值,或者您的行为就像所有高于正确阈值的概率一样:
# Enumerate all percentages, not just first n
for j, pct in enumerate(percentages):
if r < pct:
result.append(j) # Don't create tons of temporary lists; mutate in place
break # <-- Don't add more results
另请注意,如果您在概率集中有很多值,那么使用bisect
module中的函数来找到正确的值,而不是每次线性扫描都是有意义的;对于percentages
中的少量条目,线性扫描很好,但对于大量的O(log n)
次查找可能会超过O(n)
次扫描。