在Python中生成具有两个约束(sum和local maximum)的随机整数



我有一个数据框架,我想在一个新列中创建随机数。随机数必须满足两个约束条件:

  1. 随机数必须为指定的和(本例中为300)
  2. 对于每个观测值,随机数必须而不是超出约束列中的值。

在下面的例子中,因为和是300,并且随机数没有超过约束列,所以约束被满足了。

例子:

tbody> <<tr>
GEOID CONSTRAINT RANDOM
01001000000110080
0100100000025040
0100100000037560
0100100000047560
01001000000510060

您可以使用多项分布来构建近似答案:

def sample(total, constraints):
import numpy as np
rng = np.random.default_rng()
samples = rng.multinomial(total, constraints / constraints.sum(), size=100)
return next(val for val in samples if np.all(val < constraints))

df["RANDOM"] = sample(300, df["CONSTRAINT"].values)
print(df)

GEOID  CONSTRAINT  RANDOM
0  10010000001         100      81
1  10010000002          50      42
2  10010000003          75      57
3  10010000004          75      53
4  10010000005         100      67

感谢@Michael Szczesny测试这个解决方案。

解决这个问题的关键在于(引用自numpy文档):

它的值,X_i = [X_0, X_1,…], X_p],表示次数结果是i。

详情见此博客。

最新更新