工作中遇到一个问题,已知一个整数,需要随机的把它分成n个整数之和,同时要求这n个数的最大值和最小值必须介于一个范围。
主要改进思路:把这个整数看成一个线段,只需要随机生成n-1个点,插入其中,即可分成n段。


import random
# 随机分段函数。思路:把整个区间看成是一条线段。插入n-1个随机点,把线段分为n条线段。
def random_split(num, n):
random_point = [] # 用此列表,接收n-1个此范围内的随机点。
for i in range(n-1):
random_point.append(random.randint(0, num))
# 将随机点排序,并插入两个端点
random_point.sort()
random_point.insert(0,0)
random_point.append(num)
rtn = [] # 计算每两个点之间的长度
for i in range(n):
rtn.append(random_point[i+1]-random_point[i])
return rtn
# 评估随机分段函数,主要判断每个元素的值是否在最小值和最大值的范围内。
def evaluate_random_split(random_split, min_num, max_num):
for x in random_split:
if x < min_num or x > max_num:
return False
return True
# 把前面两个子函数整合起来,生成的同时判断。
def split_num(num, n, min_num = 0, max_num = float('inf')):
while True:
split_list = random_split(num, n)
if evaluate_random_split(split_list,min_num, max_num):
break
return split_list
if __name__ == "__main__":
num = 1450
n = 4
l = split_num(num, n, 100, num//2)
print(l)
1936

被折叠的 条评论
为什么被折叠?



