我有一串数字0-12,并且权重与此相关。权重数组如下:[150000, 150000, 50, 150000, 150000, 800, 130000, 130000, 25000, 100000, 100000, 100000]
。
我已经在Python中模拟了数字0-12的所有组合,但是我想编写一些其他代码来模拟选择特定组合而不进行替换的可能性。例如,选择(1,2,5,3)的概率应为(150000/total weight)*(150000/total weight-150000)*(150000/total weight-150000-150000)*(50/total weight-150000-150000-150000-50)
由于“无替换”部分,我不知道该如何编码,我在考虑使用一个for循环,该循环查看排列位置的特定数字并确定在该位置选择该数字的可能性该位置,但希望有一种方法可以查看每个单独的排列。
答案 0 :(得分:0)
我不知道为什么会有一串数字,但这是一个整数列表的工作示例,我认为这更有意义:
import random
weights = [150000, 150000, 50, 150000, 150000, 800, 130000, 130000, 25000, 100000, 100000, 100000, 10000]
total_weight = sum(weights)
l = list(range(13))
tmp_weight = 0
new_weight = 1
for i in range(5):
number = random.choice(l)
print(number)
new_weight *= weights[number]/(total_weight-tmp_weight)
tmp_weight += weights[number]
l.remove(number)
print(new_weight)
我不确定逻辑是否如您所愿,因为您的示例不清楚。
您还可以使用(数字,权重)构建元组。但是您必须先澄清您的问题。
在评论后编辑: 对于特定的数字顺序,它应该像这样
perm = [1,2,3,4]
weights = [150000, 150000, 50, 150000, 150000, 800, 130000, 130000, 25000, 100000, 100000, 100000, 10000]
total_weight = sum(weights)
tmp_weight = 0
new_weight = 1
for number in perm:
new_weight *= weights[number]/(total_weight-tmp_weight)
tmp_weight += weights[number]
print(new_weight)