如何修复随机整数生成函数并构建随机名称与整数映射的Python字典
问题修复与实现方案
一、第二个随机整数生成函数的问题修复
你写的numbers函数运行异常的核心原因有4个:
- 变量名冲突:函数参数
n代表整数位数,但循环内部又把生成的数字字符串赋值给了n,第一次循环后原始的位数参数就被覆盖了,后续循环的位数会完全错误 - 方法调用错误:
randint是random模块下的方法,你没有直接导入randint,直接调用会触发NameError - 无法保证生成足够的唯一值:用for循环生成k次的逻辑,遇到重复随机数时集合会自动去重,最终返回的元素数量会小于k
- 类型不符合需求:当前返回的是字符串类型的数字,你的需求要求值为整数类型
修复后的代码如下:
import random def numbers(k: int, n: int) -> set: """ 生成k个唯一的n位随机整数 k: 生成的整数个数 n: 每个整数的位数 """ seen = set() join = ''.join add = seen.add while len(seen) < k: # 变量名改成num_str避免覆盖参数n num_str = join([str(random.randint(0,9)) for _ in range(n)]) # 转成int再存入集合 add(int(num_str)) return seen
二、结合两个函数生成目标字典
你可以分别调用名称生成函数和数字生成函数,得到长度一致的两个集合后,直接用zip打包转为字典即可。注意需要提前导入string模块供名称生成函数使用,完整可运行代码如下:
import string import random def unique_names(k: int, ntokens: int, pool: str=string.ascii_letters) -> set: """ Generate a set of unique string tokens. k: Length of each token ntokens: Number of tokens pool: Iterable of characters to choose from """ seen = set() join = ''.join add = seen.add while len(seen) < ntokens: token = join(random.choices(pool, k=k)) add(token) return seen def numbers(k: int, n: int) -> set: """ 生成k个唯一的n位随机整数 k: 生成的整数个数 n: 每个整数的位数 """ seen = set() join = ''.join add = seen.add while len(seen) < k: num_str = join([str(random.randint(0,9)) for _ in range(n)]) add(int(num_str)) return seen # 调用示例:生成4个键值对,键长度为5,值为6位整数 name_count = 4 key_length = 5 num_length = 6 names = unique_names(key_length, name_count) nums = numbers(name_count, num_length) result_dict = dict(zip(names, nums)) print(result_dict)
运行输出示例:
{'XnJxQ': 872031, 'bRpGq': 129457, 'TtmYz': 398406, 'KsRvH': 572910}
内容的提问来源于stack exchange,提问作者pouchewar
相关产品推荐
相关产品推荐

