在Python中:
我如何生成一个N(例如10)伪随机整数的列表,每个伪随机整数都是从一个特定的范围(例如3到9之间)提取的,并且该列表的总和达到一个特定的值(例如58)?
对于本例,解决方案如下所示:
solution = [3, 7, 7, 9, 3, 6, 4, 8, 8, 3]
sum(solution)
58也就是说,10个数字,每个在3到9之间,加起来多达58个。
我尝试了一种使用np.random.dirichlet或np.random.multinomial的解决方案,就像在这里的相关问题中所建议的那样,但这些方法不允许从特定范围内选择整数。
发布于 2020-07-25 21:37:13
import random
N = 10
s = 58
i, j = 3, 9
out = [i] * N
while sum(out) != s:
idx = random.randint(0, N-1)
if out[idx] < j:
out[idx] += 1
print(out)打印(例如):
[9, 7, 6, 4, 5, 8, 3, 5, 5, 6]发布于 2020-07-25 21:38:51
我刚才提出的一个想法是初始化一个具有n个平均值的列表(因此,尽可能接近于所有相同的值),然后随机选择一对值,并在减少另一个值的同时增加另一个值,同时确保值保持在所需的范围内,所以如果值超出范围,就不要增加/减少。
发布于 2020-07-25 21:54:12
重复直到成功?
a = []
while sum(a) != 58:
a = random.choices(range(3, 10), k=10)平均需要17次尝试。
https://stackoverflow.com/questions/63093721
复制相似问题