【问题标题】:Generate random integers with two constraints (sum and local maximum) in Python在 Python 中生成具有两个约束(总和和局部最大值)的随机整数
【发布时间】:2021-09-21 15:33:51
【问题描述】:

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

  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。

【问题讨论】:

  • 如果数字由于限制而不能相加怎么办?
  • 我表达得很糟糕。让我们尝试一个例子:如果所有约束等于 10 并且总和是 300,那么您的问题没有解决方案
  • 我认为类似:res = rng.multinomial(300, df["CONSTRAINT"] / df["CONSTRAINT"].sum(), size=1) 可能适用于整数
  • @DaniMesejo - 太棒了,我只有 2% 违反了第二个约束。这非常适合拒绝抽样,首次尝试成功率为 98%。
  • @DaniMesejo 能否请您将res = rng.multinomial(300, df["CONSTRAINT"] / df["CONSTRAINT"].sum(), size=1) 放入正式答案并解释其工作原理?我使用该答案尝试了 100 组 1000 次尝试,发现平均而言,我拒绝了 23% 的结果,因为其中一个结果大于约束。因为我可以检查有效的尝试,并且每次迭代都很快,所以这个解决方案适合我。

标签: python pandas random sum constraints


【解决方案1】:

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

它的值,X_i = [X_0, X_1, ..., X_p],代表次数 结果是我。

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

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 2014-03-25
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2023-04-10
    • 2012-03-18
    相关资源
    最近更新 更多