python - 在 X 个收件人之间分配随机值
问题描述
我正在寻找一个可以在 Python 中使用的简单代码,它允许我将某个值随机拆分为一组数字,其总和等于初始值。
例如:
我有 50 个点,我想将它们随机(不均匀)分配给七个收件人,例如 15、10、7、3、8、2、5。
可能由于使用了错误的术语,我在 Google 上找不到任何东西。我对这类东西完全陌生,所以请像对 4 岁的孩子一样与我交谈。谢谢!
解决方案
干得好:
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]
这将收敛到更均匀的分布。
推荐阅读
- python - 如何在 Python 中打印包含列表名称的嵌套列表?
- sql - 将不同长度的数字转换为日期
- python - 遍历字符串并在一行上打印结果
- c# - C# Winforms 更改任务栏图标
- android - 应用程序打开时带有 DrawerLayout 的应用程序崩溃
- excel - 用户窗体和选择单元格值
- python-3.x - Youtube-dl 模块,中断时获取部分文件而不是 mp4 文件
- javascript - Css 动画在第一次触发后运行 2 次
- ravendb - RavenDB OnBeforeStore 不使用 BulkInsert 触发
- reactjs - 当客户端浏览器中唯一的东西是 AuthToken 时,如何从数据库中获取用户信息?