在 Python 中生成具有两个约束(总和和局部最大值)的随机整数
Generate random integers with two constraints (sum and local maximum) in Python
我有一个数据框,我想在其中创建一个新列中的随机数。随机数必须满足两个约束:
- 随机数相加必须达到指定的总和(本例中总和为300)
- 对于每次观察,随机数必须不超过约束列中的值。
在下面的例子中,因为总和为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 中查看更多详细信息。
我有一个数据框,我想在其中创建一个新列中的随机数。随机数必须满足两个约束:
- 随机数相加必须达到指定的总和(本例中总和为300)
- 对于每次观察,随机数必须不超过约束列中的值。
在下面的例子中,因为总和为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 中查看更多详细信息。