如何生成15个5-20区间且总和固定为227的随机数?
解决随机数生成与总和控制的问题
首先,咱们得先理清楚核心需求:生成15个5到20之间的整数,且它们的总和恰好是227。我会先拆解这个问题的逻辑,再把它整合到你的turtle绘图代码里。
思路拆解
先算个基础账:15个数每个至少是5,总和最低是15*5=75,而目标总和是227,所以我们需要额外分配227-75=152的“增量”到这15个数上。每个数最多能加20-5=15(因为上限是20),15个数最多能加15*15=225,152远小于225,所以这个目标完全可行。
具体生成步骤:
- 先创建一个列表,每个元素初始值为5(满足最小值要求)
- 计算需要额外分配的总量:
remaining = 227 - sum(初始列表) - 循环处理每个元素:给当前元素随机加一个值,这个值的范围是
0到min(15, remaining)(既不超过单个元素的最大增量,也不超过剩余需要分配的总量) - 直到剩余分配量为0,就得到了符合要求的15个数
整合到你的绘图代码里
下面是修改后的完整代码,我把随机数生成逻辑加了进去,并且用这些随机数来控制画笔前进的长度(你也可以根据需求调整使用场景):
import turtle import random turtle.bgcolor("black") t = turtle.Pen() t.width(4) colours = ["yellow", "orange", "red"] # 生成15个5-20之间、总和为227的随机数 def generate_target_numbers(): numbers = [5] * 15 remaining = 227 - sum(numbers) for i in range(len(numbers)): if remaining <= 0: break # 每个数最多能加15(20-5),同时不能超过剩余需要分配的量 add = random.randint(0, min(15, remaining)) numbers[i] += add remaining -= add # 兜底逻辑:确保剩余量全部分配完(理论上不会触发,但做个保障) while remaining > 0: idx = random.randint(0, 14) if numbers[idx] < 20: numbers[idx] += 1 remaining -= 1 return numbers # 获取符合要求的随机数列表 lengths = generate_target_numbers() # 可选:验证总和与范围(调试用) print(f"总和:{sum(lengths)}") print(f"最小值:{min(lengths)},最大值:{max(lengths)}") # 修改绘图逻辑,用生成的随机数控制前进长度 for i in range(15): # 循环15次对应15个随机数 t.pencolor(colours[random.randint(0,2)]) t.forward(lengths[i]) t.back(lengths[i]) t.left(24) # 15*24=360,保证循环结束后画笔回到初始方向
代码说明
generate_target_numbers()函数专门负责生成符合要求的随机数,先初始化基础值,再逐步分配增量,最后还有兜底逻辑确保剩余量全部分配完- 我把原代码的60次循环改成了15次,对应15个随机数,同时调整了左转角度为24度(保证最后画笔回到初始方向)
- 你可以根据实际需求调整随机数的使用方式,比如改变画笔宽度、颜色切换频率等等
内容的提问来源于stack exchange,提问作者pranksterbunny
相关产品推荐
相关产品推荐

