首页 > 解决方案 > 在 X 个收件人之间分配随机值

问题描述

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

例如:

我有 50 个点,我想将它们随机(不均匀)分配给七个收件人,例如 15、10、7、3、8、2、5。

可能由于使用了错误的术语,我在 Google 上找不到任何东西。我对这类东西完全陌生,所以请像对 4 岁的孩子一样与我交谈。谢谢!

标签: python

解决方案


干得好:

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]

这将收敛到更均匀的分布。


推荐阅读