Python如何生成12到77之间且末位不为1和8的两位数字
Python 风格的目标随机数实现方案
需求拆解
需要生成12~77闭区间内的整数,排除个位为1、8的所有数值。
推荐实现方式
方案1:预生成合法数池(最常用,推荐)
如果有多次生成的需求,优先选择该方案,预生成一次数池后后续取数都是O(1)开销,代码简洁易维护:
import random # 用列表推导式生成所有符合规则的合法数值池 valid_nums = [n for n in range(12, 78) if n % 10 not in {1, 8}] # 生成1个随机数 single_num = random.choice(valid_nums) # 生成k个不重复的随机数(k不能超过数池总长度) k = 3 multi_nums = random.sample(valid_nums, k=k)
优势:
- 列表推导式是Python原生的地道写法,逻辑一目了然,没有额外理解成本
- 无需自己写while循环做判断,避免写出死循环或者判断条件错误的问题
- 多次生成场景下性能远高于每次随机再判断的实现
方案2:数位构造法(性能最优)
如果是单次生成或者极端追求性能,可以选择按数位直接构造,完全没有遍历和无效随机的开销:
import random # 随机生成十位:取值范围1~7 ten = random.randint(1, 7) # 根据十位的边界限制生成合法的个位 if ten == 1: # 十位为1时最小值是12,排除个位0、1、8 unit = random.choice([2,3,4,5,6,7,9]) elif ten == 7: # 十位为7时最大值是77,排除个位1、8 unit = random.choice([0,2,3,4,5,6,7]) else: # 十位为2~6时,仅排除个位1、8 unit = random.choice([0,2,3,4,5,6,7,9]) random_num = ten * 10 + unit
优势:
- 每次生成的数值必然合法,没有任何无效重试的开销
- 无需遍历生成数池,内存占用为0,适合内存受限的场景
内容的提问来源于stack exchange,提问作者Oktarinet
相关产品推荐
相关产品推荐

