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

2024-09-30 00:32:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

在下面的示例中,由于总和为300且随机数不超过约束列,因此满足了约束

示例:

^{tb1}$

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

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


Tags: 数据编辑示例整数randomsumnumbers总和
1条回答
网友
1楼 · 发布于 2024-09-30 00:32:27

您可以使用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 docs):

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

请参阅本blog post中的更多详细信息

相关问题 更多 >

    热门问题