工作中遇到一个问题,已知一个整数,需要随机的把它分成n个整数之和,同时要求这n个数的最大值和最小值必须介于一个范围。
import random
# 把一个整数num分成n个数之和,最大值和最小值分别在max_num和min_num之间。
def random_split(num0, n, min_num = -1, max_num = float('inf')):
if min_num*n > num0:
return "最小值设置错误!"
while True:
num = num0
result = []
try: # 还没分配至第n个数时,就已经分配完,因此出错。
for i in range(n-1):
a = random.randint(1, num - sum(result)) # 每次生成的随机数,是1到剩余值之间的数
result.append(a)
result.append(num - sum(result))
except:
continue # 遇到出错,就进入下一次循环
if min(result) >= min_num and max(result)< max_num :
random.shuffle(result) # 打乱一下顺序
return result # 判断一下是否符合条件,不满足条件就返回空列表。
if __name__ == "__main__":
num =145 # int(input("请输入一个整数:"))
n = 4 # int(input("请输入要分成的份数:"))
result = random_split(num, n, 10, num // 2) # 最小数不小于100,最大数不大于总和的一半。
print(result)