我正在寻找一个高效的Python函数,它可以在k个容器中随机分配一个整数.

例如,allocate(3, 2)将以相同的概率产生[3, 0][2, 1][1, 2][0, 3](与Allocate an integer randomly across k bins不同,分配,而不是项目,应该均匀分布).

推荐答案

使用"星条旗"方法,我们可以将其转化为一个问题,即从n+k-1个可能的位置列表中为可能的分隔符 Select k-1个位置.(Wikipedia proof)

from random import sample

def allocate(n,k):
    dividers = sample(range(1, n+k), k-1)
    dividers = sorted(dividers)
    dividers.insert(0, 0)
    dividers.append(n+k)
    return [dividers[i+1]-dividers[i]-1 for i in range(k)]
    
print(allocate(4,3))

n-k+1)在每个可能的分配中, Select n-k+1的分配可能是每个分配中的一个.

(请注意,与 comments existing answer to a similar question中的建议有细微的区别:这个问题要求的是非负整数的有序序列,而建议的答案给出的是正整数的有序序列.通过替换而不是不替换来 Select 点的天真修改允许全套非负整数分布,但不会留下每个分布.)同样有可能.考虑分配(4,3):获得[0, 0, 4 ]的唯一方法是滚动(0, 0),但您可以通过滚动(1, 3)或(3, 1)获得[1, 2, 1 ].

Python相关问答推荐

用gekko解决的ADE方程系统突然不再工作,错误消息异常:@错误:模型文件未找到.& &

多处理代码在while循环中不工作

使用Keras的线性回归参数估计

在Python中对分层父/子列表进行排序

连接两个具有不同标题的收件箱

将输入管道传输到正在运行的Python脚本中

通过pandas向每个非空单元格添加子字符串

海上重叠直方图

使用NeuralProphet绘制置信区间时出错

多指标不同顺序串联大Pandas 模型

使用Python从rotowire中抓取MLB每日阵容

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

搜索按钮不工作,Python tkinter

Pandas:填充行并删除重复项,但保留不同的值

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

使用__json__的 pyramid 在客户端返回意外格式

根据客户端是否正在传输响应来更改基于Flask的API的行为

如何在PythonPandas 中对同一个浮动列进行逐行划分?

极点替换值大于组内另一个极点数据帧的最大值

将字节序列解码为Unicode字符串