查看: 176|回复: 3

Python中文姓名生成器脚本:随机组合百家姓与名字库实现

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在开发测试工具或需要批量构造用户数据时,生成一批看起来自然的中文姓名是常见需求。本文从标准库随机组合入手,实现一个不依赖第三方包的中文姓名生成器,再介绍使用专业 mingzi 库生成更贴近真实人口分布姓名的方案。两种方式均可直接集成到自己的脚本或项目中。

一、姓名生成的核心逻辑
无论使用哪种语言,姓名生成器都围绕三个步骤:准备姓氏列表和名字列表;从两个列表中分别随机取值并拼接;按参数控制生成规则,如名字字数、性别倾向、是否允许重复等。Python 的 random 模块可以轻松完成随机选择与组合,因此适合快速实现这类小工具。

二、标准库实现:只使用 random 模块
先定义两个基础数据池:surname_pool 存放百家姓中的常见单姓,name_pool 存放可用于名字的常用汉字。生成时先从姓氏池中随机取一个姓,再随机决定名字长度(1到3个字),然后使用 random.sample 从名字池中抽取不重复的单字组成名字。最后将姓和名拼接为完整姓名。

这里需要处理两个边界情况:如果名字长度恰好为1且与姓氏相同,则跳过该次组合,避免出现“张张”“李李”这类怪异结果;如果开启去重模式,则检查生成结果是否已存在于当前列表中,存在就重新生成。为了防止数据池过小导致无限循环,代码中设置了最大尝试次数为“目标数量乘以100”,并在最终数量不足时打印警告。

核心函数 generate_names 的完整实现如下:
  1. # -*- coding: utf-8 -*-
  2. """中文姓名生成器:标准库版本"""
  3. import random
  4. # 名字库(单字)
  5. name_pool = [
  6.     '安', '斌', '超', '东', '峰', '刚', '海', '健', '科', '兰',
  7.     '民', '宁', '鹏', '强', '荣', '山', '涛', '伟', '祥', '旭',
  8.     '宇', '元', '哲', '志', '博', '达', '飞', '创', '红', '建',
  9.     '金', '康', '乐', '良', '明', '楠', '齐', '荷', '仁', '盛',
  10.     '帅', '泰', '涵', '波', '文', '昌', '成', '诚', '川', '德',
  11.     '栋', '恩', '翰', '航', '浩', '鸿', '华', '佳', '杰', '捷',
  12.     '俊', '凯', '立', '亮', '良', '龙', '林', '霖', '梅', '鸣',
  13.     '明', '鹏', '奇', '琦', '强', '荣', '胜', '帅', '泽', '中',
  14.     '仲', '卓', '子', '自', '宗', '祖', '尊', '宙', '诸', '珂',
  15.     '夏', '简', '老', '忠', '齐', '孙', '张', '宇', '琳', '何'
  16. ]
  17. # 百家姓(单姓)
  18. surname_pool = [
  19.     '赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈',
  20.     '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许',
  21.     '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏',
  22.     '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章',
  23.     '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦',
  24.     '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳',
  25.     '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷', '贺',
  26.     '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常',
  27.     '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余',
  28.     '元', '卜', '顾', '孟', '平', '黄', '和', '穆', '杨', '李'
  29. ]
  30. def generate_names(count, min_len=1, max_len=3, unique=False):
  31.     """
  32.     生成指定数量的随机中文姓名。
  33.     :param count: 生成数量
  34.     :param min_len: 名字部分最少字数(默认1)
  35.     :param max_len: 名字部分最多字数(默认3)
  36.     :param unique: 是否要求生成的姓名不重复(默认False)
  37.     :return: 姓名列表
  38.     """
  39.     names = []
  40.     attempts = 0
  41.     max_attempts = count * 100  # 防止死循环
  42.     while len(names) < count and attempts < max_attempts:
  43.         attempts += 1
  44.         surname = random.choice(surname_pool)
  45.         name_len = random.randint(min_len, max_len)
  46.         chosen = random.sample(name_pool, name_len)
  47.         given_name = ''.join(chosen)
  48.         if name_len == 1 and given_name == surname:
  49.             continue
  50.         full_name = surname + given_name
  51.         if unique and full_name in names:
  52.             continue
  53.         names.append(full_name)
  54.     if len(names) < count:
  55.         print(f"警告:仅生成了 {len(names)} 个唯一姓名,请扩充名字库或放宽条件。")
  56.     return names
  57. if __name__ == '__main__':
  58.     try:
  59.         num = int(input("请输入要生成的姓名数量(1~99):"))
  60.     except ValueError:
  61.         print("请输入有效的整数!")
  62.         exit(1)
  63.     if num <= 0:
  64.         print("数量必须大于0!")
  65.         exit(1)
  66.     if num > 99:
  67.         print("单次生成数量不能超过99!")
  68.         exit(1)
  69.     name_list = generate_names(num, unique=False)
  70.     for idx, name in enumerate(name_list, start=1):
  71.         print(f"{idx}. {name}")
复制代码

运行脚本后,输入1到99之间的整数,程序会输出对应数量的随机姓名。若希望批量生成的姓名不重复,可以调用 generate_names(num, unique=True)。

三、进阶方案:使用 mingzi 库生成更真实的姓名
标准库方案简单灵活,但名字库完全依赖手工维护,生成的姓名在真实感上有天然局限。如果需要生成更贴近现实人口统计的姓名,推荐使用 mingzi 库。

mingzi 是一个专门面向中文姓名的 Python 库,内置了大量真实姓氏和名字,且姓氏分布比例参考了人口统计数据,并原生支持区分男女性别。安装只需执行:
  1. pip install mingzi
复制代码

基础用法非常直观:
  1. from mingzi import mingzi
  2. # 生成5个姓名,包含性别信息
  3. result = mingzi(volume=5)
  4. print(result)
  5. # 输出示例:[['王雪', '女'], ['李宇', '男'], ['张静', '女'], ['刘洋', '男'], ['陈浩', '男']]
  6. # 只生成姓名,不显示性别
  7. names = mingzi(volume=5, show_gender=False)
  8. print(names)  # ['王雪', '李宇', '张静', '刘洋', '陈浩']
  9. # 控制女性比例(70%为女性)
  10. names = mingzi(volume=10, female_rate=0.7)
复制代码

其中 volume 表示生成数量,show_gender 控制是否需要性别信息,female_rate 控制女性比例,这些参数足以满足大多数测试数据生成场景。

如果已有自己的主程序交互逻辑,只需要把生成函数替换成 mingzi 即可实现无缝集成:
  1. from mingzi import mingzi
  2. def generate_names_with_mingzi(count):
  3.     return mingzi(volume=count, show_gender=False)
复制代码

四、两种方案如何选择
标准库实现适合以下场景:不方便安装第三方包的离线环境;需要严格自定义姓氏和名字池;生成逻辑需要嵌入到更复杂的业务代码中。mingzi 库则更适合对真实性要求较高的场景,例如需要区分性别比例、希望姓氏分布符合统计规律,或者开发时需要快速生成大量测试用户数据。

无论选择哪种方案,都可以在 Python 中快速落地。建议根据项目对姓名真实性、依赖精简度和定制灵活度的不同需求,灵活选用上述两种方式。实际开发中也可以先用标准库编写核心逻辑,后续再切换为 mingzi 以增强真实感,两者的接口都足够简单,替换成本很低。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python中文姓名生成器脚本:随机组合百家姓与名字库实现

楼主的脚本思路很清晰,把生成姓名拆解成“选姓+选名”的思路很直观,而且考虑了重名和去重逻辑,对初学者来说很容易上手。我试了一下,用标准库就能跑,确实方便。 小提示:名字池里有几个重复字(比如“良”“明”“鹏”“强”“帅”等),姓氏池里“杨”“李”也重复了,虽然不影响运行,但会稍微改变随机权重,介意的话可以顺手去重。另外 `random.sample` 要求 `name_len` 不能超过名字池长度,如果以后把名字池改小或把字数上限调大,可能会报错,建议加个 `min(name_len, len(name_pool))` 的保护,或者改用 `random.choices` 允许单字重复,这样更灵活。 如果能再增加一个“性别倾向”或“按年代常用字”的参数,生成的姓名会更有真实感。不过作为测试数据生成器,目前这个版本已经够用了,感谢分享!
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python中文姓名生成器脚本:随机组合百家姓与名字库实现

这个标准库实现挺清晰的,直接看代码就能明白生成逻辑。处理边界情况也很细心,比如避免单字名和姓重复,还有去重时的最大尝试次数限制,防止死循环。 一个小小建议:名字池里好像有重复字(比如“良”和“明”都出现了两次),“孙”和“张”也混进了名字池,可能不太合适。不过整体思路没问题,适合快速测试用。 另外楼主提到还有用专业 mingzi 库的方案,但正文好像没贴出来?方便补充一下吗?正好想对比看看真实人口分布和纯随机生成的差异有多大。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python中文姓名生成器脚本:随机组合百家姓与名字库实现

这个脚本挺实用的,正好最近在搞测试数据,直接复制就能用。标准库方案很简洁,没有第三方依赖,跑起来也快。不过有个小建议:名字池和姓氏池里都有“李”“杨”等重复项,虽然不影响随机,但可能会让某些姓氏组合概率略高,不知道是不是有意为之?另外,如果能把名字库按性别分类,或者添加一个控制名字字数的参数,感觉会更灵活。感谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-24 14:59 , Processed in 0.023973 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部