如何解决Python:生成 5 个具有固定总和的随机整数每个都有自己的范围
import random
#lets take kg(for Total) for better understanding
Total = random.randint(40,110) #For example Total=100 kg and this is 100%
Total = (a+b+c+d+e)
Total 中的每个值都有自己的范围(以 % 为单位)。
首先:找到随机值(在占总数百分比的范围内。
我试过了(但 sum() 可以 > 或
a=random.randint(40,70)
b=random.randint(0,4)
c=random.randint(0,2)
d=random.randint(22,44)
e=random.randint(0,7)
第二:找到 a、b、c、d、e 的准确值(根据第一部分中 Total 的百分比)。我试过这个:
a=Total*random.randint(40,70)/100
b=Total*random.randint(0,4)/100
c=Total*random.randint(0,2)/100
d=Total*random.randint(22,44)/100
e=Total*random.randint(0,7)/100
此代码不起作用。请帮忙
解决方法
试试这个:
import random
random_ints = []
sum_randoms = 0
upper_limit = 100
while sum(random_ints) < 100 and len(random_ints) < 5:
random_int = random.randint(0,upper_limit)
random_ints.append(random_int)
upper_limit = 100 - sum(random_ints)
random_ints.append(100 - sum(random_ints))
print(random_ints)
,
我会先从最小的范围开始,然后不是随机选择最后一个,而是选择其他 4 和 100 之和的差值。由于不能保证随机数满足所有约束,您可能需要不断挑选,直到得到满意的答复。
def sum_to_100(range_list):
if sum(lo for lo,hi in range_list) > 100 or sum(hi for lo,hi in range_list) < 100:
raise ValueError('Solution is impossible within the constraints')
ordered_ranges = sorted((lo,hi,i) for i,(lo,hi) in enumerate(range_list))
n = len(range_list)
solution = []
while len(solution) != n or sum(solution) != 100:
index = len(solution)
lo,i = ordered_ranges[index]
if index == n - 1:
final = 100 - sum(solution)
if lo <= final <= hi:
solution.append(final)
else: # start over
solution = []
else:
solution.append(random.randint(lo,hi))
# restore the original order
solution = [num for i,num in sorted(enumerate(solution),key=lambda x:ordered_ranges[x[0]][2])]
return solution
>>> sum_to_100([(40,70),(0,4),2),(22,44),7)])
[59,3,1,32,5]
>>> sum_to_100([(40,7)])
[47,2,44,7]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。