在 Python 中生成具有两个约束(总和和局部最大值)的随机整数

Generate random integers with two constraints (sum and local maximum) in Python

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

  1. 随机数相加必须达到指定的总和(本例中总和为300)
  2. 对于每次观察,随机数必须超过约束列中的值。

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

示例:

GEOID CONSTRAINT RANDOM
010010000001 100 80
010010000002 50 40
010010000003 75 60
010010000004 75 60
010010000005 100 60

似乎已经演示了 random numbers totaling a sum,但我没有看到带有第二个约束的示例。

为清楚起见编辑:新列必须是整数。最小下限值为 0.

您可以使用 multinomial 分布构建一个 近似 答案:

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 文档):

Its values, X_i = [X_0, X_1, ..., X_p], represent the number of times the outcome was i.

在此 blog post 中查看更多详细信息。