首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 隨機生成中文姓名與拼音(含雙字姓支援)

     編輯:Java 相關知識

本文實現一個隨機中文姓名生成器,支援單字姓、雙字姓(複姓),並同步生成對應拼音。核心思路:預置姓氏庫與字庫(含拼音標註),隨機組合生成 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]

JSP 驗證碼圖片生成示例

將生成的姓名與拼音繪製到圖片上,可用於驗證碼或展示:


<%@ 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>

總結

隨機姓名生成核心在於「豐富的字庫 + 合理的隨機組合策略」。本實現支援複姓、拼音同步生成、圖形化輸出,可直接用於測試數據生成、驗證碼、匿名化展示等場景。生產環境建議接入真實姓名統計數據,提高生成結果的真實感與分布合理性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved