在X个收件人之间分配随机值

时间:2018-11-16 14:18:47

标签: python

我正在寻找可以在Python中使用的简单代码,该代码允许我将某个值随机分成一组数字,这些数字的总和等于初始值。

例如:

我有50分,我想在七个接收者之间随机(而不是平均)分配它们,例如15、10、7、3、8、2、5。

我可能在Google上找不到任何内容,可能是因为使用了错误的术语。我对这种东西是完全陌生的,所以请像四岁的孩子一样跟我说话。谢谢!

1 个答案:

答案 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]

这将趋于更均匀的分布。