我正在寻找可以在Python中使用的简单代码,该代码允许我将某个值随机分成一组数字,这些数字的总和等于初始值。
例如:
我有50分,我想在七个接收者之间随机(而不是平均)分配它们,例如15、10、7、3、8、2、5。
我可能在Google上找不到任何内容,可能是因为使用了错误的术语。我对这种东西是完全陌生的,所以请像四岁的孩子一样跟我说话。谢谢!
答案 0 :(得分:0)
您要去的地方
def partition(x,num_rec):
if(x<num_rec):
print('please provide a number of recipient inferior to the number')
return 0
res = []
for i in range(num_rec-1):
j = random.randint(1,x-(num_rec-i))
res.append(j)
x = x-j
res.append(x)
return np.random.permutation(res)
,如果您进行测试:
for i in range(10):
r = partition(50,7)
print(sum(r),r)
>>> 50 [16 4 2 1 24 1 2]
>>> 50 [ 2 1 6 17 1 2 21]
>>> 50 [ 1 5 5 8 2 2 27]
>>> 50 [36 2 2 1 1 7 1]
>>> 50 [ 3 2 18 1 3 1 22]
>>> 50 [ 3 17 6 2 4 4 14]
>>> 50 [ 1 12 12 3 2 17 3]
>>> 50 [ 3 34 4 1 1 1 6]
>>> 50 [ 2 2 3 2 26 9 6]
>>> 50 [ 3 2 1 2 16 1 25]
如前所述,列表倾向于排序,因此您可以添加一个随机排列来避免这种情况。 (代码已在上面更新)
另一种方法是创建列表并随机填充。 使用这种方法,您不会遇到不平衡问题。
def partition(x,num_rec):
res = [1]*num_rec
for i in range(x-num_rec):
res[random.randint(0,num_rec-1)] +=1
return res
>>> 50 [6, 6, 10, 7, 6, 6, 9]
>>> 50 [9, 6, 7, 7, 7, 5, 9]
>>> 50 [8, 7, 10, 10, 5, 5, 5]
>>> 50 [6, 3, 14, 7, 6, 3, 11]
>>> 50 [12, 5, 12, 4, 4, 6, 7]
>>> 50 [6, 7, 9, 5, 6, 7, 10]
>>> 50 [8, 6, 6, 5, 6, 5, 14]
>>> 50 [4, 10, 6, 9, 7, 9, 5]
>>> 50 [8, 4, 9, 5, 8, 9, 7]
>>> 50 [9, 10, 7, 7, 6, 4, 7]
这将趋于更均匀的分布。