我在30-60范围内有一个随机整数,可以使用randint(30,60)获得.假设它是40.我想将此数字精确地分成7个随机整数.因此,例如[5,5,5,5,5,5,10]是有效的结果.但是还有很多可能的解决方案,例如[6,6,6,6,6,6,4]或[4,2,9,13,8,1,3] …
我知道有很多解决方案,但我正在寻找一种快速的解决方案.我并不是想获得每一个解决方案,而是在寻找一种在短时间内迭代很多解决方案的快速方法.实现该目标的一种方法是随机选择一个数字(假设范围为1-15)并将其保存到列表中,然后进行while循环直到总和恰好为40.我尝试过这样做,但效率不高所有.我认为选择一个起始值,例如[5,5,5,5,5,5,10]并以一种精确的方式更改数字,例如“第一个数字-2”和第3个2即可得出[3,5,7,5 ,, 5,5,10]是一个更快的解决方案.有谁知道该怎么做或有很好的建议?谢谢.我更喜欢python 3.
最佳答案
如果您只想获得一个合计的任意数字集,而不是对所有组合进行详尽的迭代,那么以下内容将为您提供所需的信息.
def get_parts(total, num_parts=7, max_part=15):
running_total = 0
for i in range(num_parts - 1):
remaining_total = total - running_total
upper_limit = min(max_part, remaining_total - num_parts + 1 + i)
# need to make sure there will be enough left
lower_limit = max(1, remaining_total - max_part*(num_parts - i - 1))
part = randint(lower_limit, upper_limit)
running_total += part
yield part
yield total - running_total
>>> list(get_parts(40))
[2, 7, 10, 11, 1, 4, 5]
>>> list(get_parts(40))
[7, 13, 11, 6, 1, 1, 1]
>>> list(get_parts(50, 4))
[6, 14, 15, 15]
当然,上面每个列表中的项目并不是真正随机的,并且会优先使用列表中较大的数字和之后较小的数字.如果您想要更多伪随机元素,则可以通过random.shuffle()提供这些列表.