Python3.8如何生成指定位数且各位数字和为指定值的随机数
实现指定长度、指定各位数字和的随机数生成功能
原有代码的核心问题
input()获取的输入为字符串类型,未转为整数,后续对比会出现类型不匹配问题- 直接对整数调用
len()会抛出类型错误,需先转为字符串再计算长度 random.randint(0,99999)的范围固定为最多5位数字,无法满足更长位数的生成需求- 仅单次生成随机数就校验,命中符合要求结果的概率极低,几乎无法得到有效输出
解决方案
方案1:改进的随机校验法(适合长度≤10、和的要求不极端的场景)
思路是固定随机数的生成范围为对应位数的合法区间,循环生成并校验直到得到符合要求的结果,实现逻辑简单:
import random def generate_random_num(required_length: int, required_sum: int): # 合法性校验 if required_length < 1: raise ValueError("长度必须大于等于1") max_possible_sum = 9 * required_length if required_sum < 1 or required_sum > max_possible_sum: raise ValueError(f"合法的数字和范围为1到{max_possible_sum}") # 对应位数的区间:比如7位就是1000000 ~ 9999999 min_num = 10 ** (required_length - 1) max_num = 10 ** required_length - 1 while True: num = random.randint(min_num, max_num) current_sum = sum(int(d) for d in str(num)) if current_sum == required_sum: return num # 测试示例:生成7位、各位和为7的随机数 print(generate_random_num(7,7))
方案2:构造生成法(高效,适合所有合法场景)
思路是直接构造符合规则的数字,无需反复随机校验,性能不受长度和数值和的影响:
import random def generate_random_num(required_length: int, required_sum: int): # 合法性校验 if required_length < 1: raise ValueError("长度必须大于等于1") max_possible_sum = 9 * required_length if required_sum < 1 or required_sum > max_possible_sum: raise ValueError(f"合法的数字和范围为1到{max_possible_sum}") # 初始化数字列表,第一位至少为1,其余为0 digits = [1] + [0] * (required_length - 1) remain_sum = required_sum - 1 # 随机分配剩余的和到各个数位,每个数位最大不超过9 while remain_sum > 0: # 随机选一个位置 idx = random.randint(0, required_length - 1) # 该位置最多还能加多少 add = min(remain_sum, 9 - digits[idx]) digits[idx] += add remain_sum -= add # 转成整数返回 return int(''.join(map(str, digits))) # 测试示例:生成7位、各位和为7的随机数 print(generate_random_num(7,7))
内容的提问来源于stack exchange,提问作者noExplorer
相关产品推荐
相关产品推荐

