本文實現一個隨機中文姓名生成器,支援單字姓、雙字姓(複姓),並同步生成對應拼音。核心思路:預置姓氏庫與字庫(含拼音標註),隨機組合生成 2-3 字姓名。附帶 JSP 驗證碼圖片生成示例,展示姓名與拼音的圖形化輸出。
// 姓氏庫:格式 "中文|拼音"
String[] surnames = {
"趙|zhao", "錢|qian", "孫|sun", "李|li", "周|zhou", "吳|wu", "鄭|zheng", "王|wang",
"馮|feng", "陳|chen", "褚|chu", "衛|wei", "蒋|jiang", "沈|shen", "韓|han", "楊|yang",
// 複姓
"歐陽|ouyang", "司馬|sima", "慕容|murong", "諸葛|zhuge", "長孫|zhangsun",
"獨孤|dugu", "西門|ximen", "尉遲|yuchi"
};
// 字庫:格式 "拼音|可用漢字集合"
String[] givenNamePools = {
"ai|皚艾哀", "an|安黯谙", "ao|奧傲敖骜翱", "ang|昂盎",
"bai|白佰", "bao|寶保報", "bei|北倍貝備", "ben|奔本錛",
// ... 更多拼音組
"zhong|中忠鐘衷", "zhou|周州舟胄繇晝", "zhu|竹主立足朱祝諸珠著竺",
"zi|子資茲紫姿孜梓秭", "zong|宗枞", "zu|足族祖卒", "zuo|作左佐"
};
package com.cn.wangk.util.name;
import java.util.Random;
public class ChineseNameGenerator {
private static final String[] SURNAMES = {
"趙|zhao", "錢|qian", "孫|sun", "李|li", "周|zhou", "吳|wu", "鄭|zheng", "王|wang",
"馮|feng", "陳|chen", "褚|chu", "衛|wei", "蒋|jiang", "沈|shen", "韓|han", "楊|yang",
"朱|zhu", "秦|qin", "尤|you", "許|xu", "何|he", "呂|lv", "施|shi", "張|zhang",
"孔|kong", "曹|cao", "嚴|yan", "華|hua", "金|jin", "魏|wei", "陶|tao", "姜|jiang",
"戚|qi", "謝|xie", "鄒|zou", "喻|yu", "柏|bai", "水|shui", "窦|dou", "章|zhang",
"雲|yun", "蘇|su", "潘|pan", "葛|ge", "奚|xi", "范|fan", "彭|peng", "郎|lang",
"魯|lu", "韋|wei", "昌|chang", "馬|ma", "苗|miao", "鳳|feng", "花|hua", "方|fang",
"俞|yu", "任|ren", "袁|yuan", "柳|liu", "酆|feng", "鮑|bao", "史|shi", "唐|tang",
"費|fei", "廉|lian", "岑|cen", "薛|xue", "雷|lei", "賀|he", "倪|ni", "湯|tang",
"滕|teng", "殷|yin", "羅|luo", "畢|bi", "郝|hao", "邴|bing", "鄒|zou", "安|an",
"常|chang", "樂|le", "於|yu", "時|shi", "傅|fu", "皮|pi", "卞|bian", "齊|qi",
"康|kang", "伍|wu", "餘|yu", "元|yuan", "卜|bu", "顧|gu", "孟|meng", "平|ping",
"黃|huang", "和|he", "穆|mu", "蕭|xiao", "尹|yin", "姚|yao", "邵|shao", "湛|zhan",
"汪|wang", "祁|qi", "毛|mao", "禹|yu", "狄|di", "米|mi", "貝|bei", "明|ming",
"臧|zang", "計|ji", "伏|fu", "成|cheng", "戴|dai", "談|tan", "宋|song", "茅|mao",
"龐|pang", "熊|xiong", "紀|ji", "舒|shu", "屈|qu", "項|xiang", "祝|zhu", "董|dong",
"梁|liang", "杜|du", "阮|ruan", "藍|lan", "閔|min", "席|xi", "季|ji", "麻|ma",
"強|qiang", "賈|jia", "路|lu", "嬴|ying", "危|wei", "江|jiang", "童|tong", "顏|yan",
"郭|guo", "梅|mei", "林|lin", "刁|diao", "鍾|zhong", "徐|xu", "丘|qiu", "駱|luo",
"高|gao", "夏|xia", "蔡|cai", "田|tian", "樊|fan", "胡|hu", "凌|ling", "霍|huo",
"虞|yu", "萬|wan", "支|zhi", "柯|ke", "昝|zan", "管|guan", "盧|lu", "莫|mo",
"經|jing", "房|fang", "裘|qiu", "繆|miao", "干|gan", "解|jie", "應|ying", "宗|zong",
"丁|ding", "宣|xuan", "賓|bin", "郁|yu", "單|shan", "掛|gua", "洪|hong", "包|bao",
"諸|zhu", "左|zuo", "石|shi", "崔|cui", "吉|ji", "鈕|niu", "龔|gong", "嚴|yan",
"池|chi", "葉|ye", "祝|zhu", "鄂|e", "鄧|deng", "欒|luan", "雷|lei", "陳|chen",
"華|hua", "裴|pei", "廉|lian", "翟|zhai", "褚|chu", "趙|zhao", "鞏|gong", "伍|wu",
"歐陽|ouyang", "司馬|sima", "慕容|murong", "諸葛|zhuge", "長孫|zhangsun",
"獨孤|dugu", "西門|ximen", "尉遲|yuchi", "公孫|gongsun", "軒轅|xuanyuan",
"令狐|linghu", "鍾離|zhongli", "宇文|yuwen", "慕容|murong", "鮮于|xianyu",
"閻|yan", "百里|baili", "呼延|huyan", "司徒|situ", "司空|sikong", "丘|qiu",
"左丘|zuoqiu", "東門|dongmen", "西門|ximen", "商|shang", "牟|mou", "佘|she",
"佴|nai", "伯|bo", "賓|bin", "轅|yuan", "濮|pu", "牛|niu", "壽|shou", "通|tong",
"邊|bian", "扈|hu", "燕|yan", "冀|ji", "郤|xi", "郟|jia", "璩|qu", "桑|sang",
"桂|gui", "濮|pu", "牛|niu", "壽|shou", "通|tong", "邊|bian"
};
private static final String[] GIVEN_NAME_POOLS = {
"ai|皚艾哀", "an|安黯谙", "ao|奧傲敖骜翱", "ang|昂盎",
"ba|罷霸", "bai|白佰", "ban|斑般", "bang|邦",
"bei|北倍貝備", "biao|表標彪飆飙", "bian|邊卞弁忭", "bu|步不",
"cai|才材財彩", "cang|蒼倉", "cao|曹草操漕", "cen|參岑",
"chang|常長昌敞玚", "chao|超朝潮巢", "chen|晨辰陳諶", "cheng|程呈誠承乘",
"chi|遲持池赤尺馳熾", "chong|沖蟲崇", "chou|愁醜籌", "chu|楚儲觸矗",
"chuan|川穿船傳", "chuang|創幢床闖", "chui|吹垂錘", "chun|春純萃蠢",
"ci|此次詞茨辭慈", "cong|叢從聰", "cou|湊輳", "cu|粗促徂",
"cuan|竄攛篡", "cui|催脆翠璀", "cun|存寸村", "cuo|措錯磋",
"da|達大答打", "dai|呆歹代戴貸", "dan|丹單擔膽", "dang|黨蕩檔",
"dao|道島盜禱", "de|德得的", "deng|登燈鄧等", "di|弟帝低底遞蒂",
"dia|嗲", "dian|顛點碘店", "diao|調釣吊貂", "die|疊諜蝶",
"ding|丁盯釘頂訂", "diu|丟鋌", "dong|東冬董動棟", "dou|都鬥抖豆",
"du|獨都度渡杜", "duan|段緻鍛", "dui|隊對敦", "dun|頓盾鈍",
"e|惡餓俄峨", "en|恩摁蒽", "er|兒耳爾", "fa|發乏伐罰",
"fan|范凡反泛帆番翻", "fang|方訪放芳坊", "fei|非飛肥費廢", "fen|分紛奮粉",
"feng|風鳳封豐奉峰鋒", "fo|佛", "fou|否", "fu|夫符弗芙扶拂",
"ga|尷尬", "gai|改蓋賠", "gan|甘敢趕桿", "gang|崗鋼剛綱",
"gao|高皋郜鎬", "ge|哥格革個各", "gei|給", "gen|根跟庚",
"geng|耕更庚羹", "gong|工攻功供恭", "gou|溝勾鉤狗", "gu|古姑估谷骨",
"gua|掛乖呱刮", "guai|拐怪", "guan|關官觀管館", "guang|光廣逛",
"gui|規歸龜閨軌", "gun|滾棍衮", "guo|國果鍋過", "ha|哈鉿",
"hai|海孩害駭", "han|寒汗漢憨韓", "hang|航杭巷行", "hao|號浩皓蒿昊灏",
"he|和河喝荷合何", "hei|嘿黑", "hen|很恨", "heng|亨恆衡哼",
"hong|洪紅宏鴻虹泓弘", "hou|後侯猴吼厚", "hu|虎忽湖護乎祜滸怙",
"hua|化花華驊樺", "huai|壞懷淮槐", "huan|歡環換喚桓", "huang|黃皇凰煌",
"hui|灰揮輝會慧匯", "hun|渾混婚魂", "huo|或霍貨火夥", "ji|擊機基積極濟",
"jia|加佳甲夾家", "jian|堅尖簡減檢", "jiang|江薑將疆蔣", "jiao|教嬌腳角交",
"jie|接傑潔結姐", "jin|今斤金津進", "jing|京驚精景徑", "jiong|囧窘",
"jiu|九酒久究救", "ju|居巨局舉聚", "juan|捐圈卷眷", "jue|決覺爵",
"jun|君軍峻均鈞", "ka|喀咖咔", "kai|開凱愷鍇", "kan|刊看砍坎",
"kang|康抗糠慷", "kao|考拷烤靠", "ke|可克科刻珂", "ken|肯懇",
"keng|坑吭鏗", "kong|空恐控孔", "kou|口扣寇", "ku|苦庫褲酷",
"kua|誇跨垮挎", "kuai|快塊噲", "kuan|寬款", "kuang|狂框礦曠",
"kui|虧窺葵奎", "kun|困坤鯤", "kuo|廓擴闊", "la|拉啦臘",
"lai|來賴萊", "lan|藍欄攔瀾", "lang|朗浪廊琅閬", "lao|老勞佬撈",
"le|了勒樂", "lei|雷壘淚類", "leng|冷楞稜", "li|歷離裡理利立力麗禮黎栗荔瀝",
"lia|倆", "lian|連廉斂鍊", "liang|兩糧涼梁良", "liao|了料撩遼",
"lie|列烈裂獵", "lin|林臨鄰琳鱗", "ling|靈領令另淩", "liu|溜劉流柳六",
"long|龍隆隴壟", "lou|樓摟摟", "lu|盧魯路陸錄", "lv|呂鋁旅綠律",
"luan|亂巒卵", "lue|略掠", "lun|論輪倫崙", "luo|羅洛落駱",
"ma|馬碼螞麻", "mai|麥賣邁脈", "man|滿慢漫蠻", "mang|忙芒盲茫",
"mao|貓貌冒毛矛", "me|嗎麼", "mei|美妹媚枚梅", "men|們門悶",
"meng|夢蒙盟猛", "mi|米密謎覓彌", "mian|免面棉眠", "miao|秒苗描瞄渺",
"mie|滅蔑", "min|民敏閔皿", "ming|名明鳴銘", "miu|謬", "mo|莫墨默摸",
"mou|某謀謀", "mu|母木目牧慕", "na|那拿哪納", "nai|乃奶耐奈",
"nan|南楠男", "nang|囊囔", "nao|腦惱鬧", "ne|訥餒", "nei|內餒",
"nen|嫩", "neng|能", "ni|妮妳尼泥倪", "nian|年念粘", "niang|娘酿",
"niao|鳥尿", "nie|聶孽鎳", "nin|您", "ning|寧凝佞", "niu|牛扭鈕",
"nong|農濃弄", "nu|奴努怒", "nv|女恧", "nuan|暖", "nue|虐瘧",
"nuo|諾懦糯", "o|哦喲", "ou|歐區鷗", "pa|帕怕趴", "pai|派湃拍",
"pan|潘盤判叛", "pang|胖龐旁螃", "pao|跑炮袍泡", "pei|配佩培賠",
"pen|盆噴", "peng|朋鵬捧碰", "pi|皮批披脾", "pian|片翩騙",
"piao|飄漂票剽", "pie|撇瞥", "pin|拼頻貧品", "ping|平憑蘋評",
"po|坡婆破魄", "pou|剖裒", "pu|鋪普樸譜", "qi|其奇騎氣棋",
"qia|恰洽葜", "qian|千遷簽謙", "qiang|強牆腔鏹", "qiao|橋喬巧敲",
"qie|切竊", "qin|琴勤親欽", "qing|清輕情晴請", "qiong|瓊窮",
"qiu|秋球求囚", "qu|區趨取曲趣", "quan|全權泉圈", "que|缺確雀",
"qun|群裙", "ran|然燃染", "rang|讓嚷攘", "rao|饒繞", "re|熱惹",
"ren|仁人任認刃", "reng|扔仍", "ri|日", "rong|榮容融絨",
"rou|柔肉揉", "ru|儒孺如辱乳", "ruan|軟阮", "rui|瑞銳芮",
"run|潤閏", "ruo|若弱", "sa|撒薩颯", "sai|賽塞噻", "san|三傘散",
"sang|喪桑", "sao|掃嫂騷", "se|色澀", "sen|森", "seng|僧",
"sha|沙紗殺廈", "shai|曬篩", "shan|山刪閃陝", "shang|上賞商裳",
"shao|少燒稍勺", "she|奢舍設攝", "shen|深審神參莘", "sheng|生聲繩省",
"shi|師史石時十世士詩獅", "shou|收手首守壽", "shu|書輸樹束梳",
"shua|刷耍", "shuai|帥率衰", "shuan|拴栓", "shuang|雙爽霜",
"shui|水稅誰", "shun|順瞬舜", "shuo|說碩朔", "si|斯思絲司祀",
"song|松頌誦", "sou|搜艘嗽", "su|蘇俗素速溯", "suan|算蒜酸",
"sui|歲遂穗隧", "sun|孫損筍", "suo|所索鎖瑣", "ta|它塔塌他",
"tai|太態泰臺", "tan|談壇彈探", "tang|唐堂糖棠", "tao|濤逃陶討",
"te|特忒", "teng|騰疼誊", "ti|提題體梯", "tian|天田甜填",
"tiao|條挑跳眺", "tie|鐵貼帖", "ting|聽庭亭停", "tong|通同童統",
"tou|頭投透偷", "tu|圖徒途凸", "tuan|團推湍", "tui|退腿褪",
"tun|屯吞囤", "tuo|拓托脫託", "wa|哇挖襪", "wai|外歪崴",
"wan|萬宛晚彎", "wang|王望網往", "wei|衛微偉維威韋緯煒",
"wen|文聞紋穩", "weng|翁嗡", "wo|我窩握渥", "wu|吳烏無誤務",
"xi|西希昔熙熹", "xia|夏下嚇蝦", "xian|先賢顯險", "xiang|向項香響",
"xiao|曉蕭笑肖校", "xie|謝協寫械", "xin|新心信鑫", "xing|星興行刑",
"xiong|熊雄", "xiu|修秀宿繡", "xu|序徐續許需", "xuan|選旋炫軒",
"xue|學雪穴薛", "xun|尋訓巡勳", "ya|呀壓押鴉", "yan|嚴研言顏",
"yang|央羊洋陽漾", "yao|藥要搖堯", "ye|也業葉頁", "yi|一醫依衣伊",
"yin|因音銀陰蔭", "ying|英影穎鷹應", "yo|喲", "yong|永用詠勇",
"you|優尤友右有", "yu|漁郁寓於余玉雨語預", "yuan|元圓源緣遠",
"yue|月躍悅閱", "yun|雲運勻孕", "za|雜咋", "zai|再在載災",
"zan|贊暫攢", "zang|臟葬", "zao|早棗造噪", "ze|則澤擇責",
"zei|賊", "zen|怎", "zeng|曾增贈", "zha|渣紮劄", "zhai|摘齋宅債",
"zhan|站戰占粘", "zhang|張漲掌帳", "zhao|招照找趙", "zhe|者哲摺",
"zheng|正政症掙蒸", "zhi|之支枝知質致", "zhong|中忠鐘衷", "zhou|周州舟",
"zhu|主住助祝珠", "zhua|抓爪", "zhuai|拽", "zhuan|專轉磚",
"zhuang|莊裝壯撞", "zhui|追椎墜", "zhun|準諄", "zhuo|卓拙桌濁",
"zi|資茲諮姿", "zong|總宗棕", "zou|走奏揍", "zu|族祖足卒",
"zuan|鑽纂", "zui|最醉罪", "zun|尊遵", "zuo|作左做坐"
};
private String generatedName;
private String generatedPinyin;
public ChineseNameGenerator() {}
/**
* 生成隨機姓名與拼音
*/
public void generate() {
Random random = new Random();
// 1. 隨機選擇姓氏
String[] surnameParts = SURNAMES[random.nextInt(SURNAMES.length)].split("\\|");
String surname = surnameParts[0];
String surnamePinyin = surnameParts[1];
// 2. 生成名字(1-2 字)
StringBuilder nameBuilder = new StringBuilder(surname);
StringBuilder pinyinBuilder = new StringBuilder(surnamePinyin);
int nameLength = random.nextInt(2) + 1; // 1 或 2 字
for (int i = 0; i < nameLength; i++) {
String[] poolParts = GIVEN_NAME_POOLS[random.nextInt(GIVEN_NAME_POOLS.length)].split("\\|");
String pinyin = poolParts[0];
String chars = poolParts[1];
char selectedChar = chars.charAt(random.nextInt(chars.length()));
nameBuilder.append(selectedChar);
pinyinBuilder.append(",").append(pinyin);
}
this.generatedName = nameBuilder.toString();
this.generatedPinyin = pinyinBuilder.toString();
}
public String getName() { return generatedName; }
public String getPinyin() { return generatedPinyin; }
// 測試
public static void main(String[] args) {
ChineseNameGenerator gen = new ChineseNameGenerator();
for (int i = 0; i < 20; i++) {
gen.generate();
System.out.println(gen.getName() + " [" + gen.getPinyin() + "]");
}
}
}
張偉 [zhang,wei]
李娜 [li,na]
王曉明 [wang,xiao,ming]
歐陽修 [ouyang,xiu]
司馬遷 [sima,qian]
諸葛亮 [zhuge,liang]
慕容雪 [murong,xue]
獨孤求敗 [dugu,qiu,bai]
將生成的姓名與拼音繪製到圖片上,可用於驗證碼或展示:
<%@ page contentType="image/jpeg;charset=UTF-8" %>
<%@ page import="java.awt.*, java.awt.image.*, java.util.*, javax.imageio.*, com.cn.wangk.util.name.ChineseNameGenerator" %>
<%
// 禁止緩存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 創建圖片緩衝區
int width = 200, height = 60;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
// 背景
g.setColor(new Color(230, 240, 250));
g.fillRect(0, 0, width, height);
// 干擾線
Random random = new Random();
g.setColor(new Color(180, 190, 200));
for (int i = 0; i < 30; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = x1 + random.nextInt(20);
int y2 = y1 + random.nextInt(10);
g.drawLine(x1, y1, x2, y2);
}
// 生成姓名
ChineseNameGenerator gen = new ChineseNameGenerator();
gen.generate();
String name = gen.getName();
String pinyin = gen.getPinyin();
// 繪製姓名
g.setFont(new Font("微軟雅黑", Font.BOLD, 28));
g.setColor(Color.BLACK);
g.drawString(name, 20, 35);
// 繪製拼音
g.setFont(new Font("微軟雅黑", Font.PLAIN, 14));
g.setColor(Color.GRAY);
g.drawString(pinyin, 20, 50);
// 邊框
g.setColor(Color.DARK_GRAY);
g.drawRect(0, 0, width - 1, height - 1);
g.dispose();
// 輸出
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
| 需求 | 實現方向 |
|---|---|
| 性別區分 | 字庫分男/女/通用,生成時按性別選池 |
| 避免負面字 | 建立黑名單過濾(如「殘」、「病」、「賤」等) |
| 姓名唯一性 | 結合時間戳/隨機數/序列號,或查重數據庫 |
| 更真實分布 | 根據《百家姓》頻率加權、名字字頻統計加權 |
| 多語系支援 | 擴展拼音欄位為 Map<Locale, String> |
隨機姓名生成核心在於「豐富的字庫 + 合理的隨機組合策略」。本實現支援複姓、拼音同步生成、圖形化輸出,可直接用於測試數據生成、驗證碼、匿名化展示等場景。生產環境建議接入真實姓名統計數據,提高生成結果的真實感與分布合理性。