令列表l由n个元素组成,其中
- 每个元素应为 0 或小于或等于 r 的正整数,并且
- 列表的总和应该等于m
例子:
Given n = 5, r = 4, m = 10
l = [4, 3, 2, 0, 1]
很容易满足规则(1),但我想知道是否有什么好主意/算法来满足这两个规则?
最佳答案
这是一个简单的暴力解决方案。基本上,您想要生成样本,其中随机整数小于 r
的可能性相同。不符合标准(总和为 m
)的样本将被拒绝。
import numpy as np
def rand_with_rules(n, r, m):
if n*(r-1) < m:
raise ValueError
while True:
l = np.random.randint(0, r, size=(n))
if l.sum() == m:
return l
请注意,拒绝样本必然会使您的“随机”数字产生偏差。由于您的限制,您不能拥有一组纯粹的随机数,并且某些意愿往往会过多或不足。
例如,n, r, m = 2, 3, 4 的情况。唯一符合这个条件的系列是 (2, 2),所以抽到 2 的可能性是 100%,其他抽到 0%值(value)观。
本质上,这个解决方案表明您事先不知道哪些整数最有可能。然而,由于约束,您对数字的后验知识几乎永远不会真正统一。
对于给定此约束的整数分布,可能有一个聪明的解析解,您可以使用它来生成样本。但我不知道它是什么!
关于python - 使用规则随机生成列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31737663/