【Java随机生成中文姓名】

随机生成中文姓名

目的:
GenerateName 类的目的是从预定义的 JSON 文件中加载中文姓名数据,并能够随机生成中文姓名,调用时控制循环次数,即可生成n个随机中文姓名。
调用只需:

        for (int i = 0; i < 100; i++) {
            System.out.println(new GenerateName().getRandomName());
        }

即可生成如下的名字:

晋悦昌 荣慧  喻忆  訾祥兵 程谦  齐珍  蒙媛琴 梁厚益 勾声安 毛雨健 巫发士 车雄嘉 仲孙霞蓓 束继云 荆毅彤 和莲  牛迅  薄雅迎 商峰元 郁爱  余月霏 郁发宇 东石咏 阎中  牧群  闻人桐诗 邬采  鞠倩  甘润  益进  岑勇  左丘崊  伊名  公西捷  闫霏  董伶  纪娇  西门南  晋笑  符萌宏 章凝  孟化俊 鞠玹  惠章义 瞿仪  奚振化 郏泊  耿麟婧 阚熙  巩娴  匡春  郜生惠 解茜俊 蓝伊继 红孝婉 陶棋  艾宪  周勇为 姜碧  沈杨纶 雍溓  计刚建 宗政成根 邓靓冉 万仁  裘瑞  孙毅紫 倪焘春 鞠善淇 融芷德 郁森  熊宜  融可业 简东娆 东国汝 漆雕亦苹 计融  徐哲  武科  祝定浩 全诚理 农方  邢利  弓竹钰 班俪  弓章恒 王敖筱 冉贝  邬仪  邢奇海 匡才  向乔萌 夔秋品 卜运瀚 禄林  别帆至 谢芸征 郎润勇 葛起  阙辉  

实现方法:

  1. 数据加载
    类在构造时使用 ObjectMapper 从类路径下的 /name.json 文件中读取姓名数据。数据被解析为一个 NameData 对象,该对象包含两个列表:surnames(姓氏)和 givenNames(名字)。

public GenerateName() {
    try {
        ObjectMapper mapper = new ObjectMapper();
        NameData data = mapper.readValue(getClass().getResourceAsStream("/name.json"), NameData.class);
        this.surnames = data.getSurnames();
        this.givenNames = data.getGivenNames();
    } catch (IOException e) {
        throw new NameDataLoadingException("Failed to load name data from '/name.json'", e);
    }
}

如果数据加载失败,将抛出自定义的 NameDataLoadingException。

  1. 随机姓名生成
    getRandomName 方法使用 Random 类实例来随机选择一个姓氏和两个名字,并将它们拼接成一个字符串返回。
public String getRandomName() {
    String surname = surnames.get(random.nextInt(surnames.size()));
    String givenName = givenNames.get(random.nextInt(1, givenNames.size()));
    String givenName2 = givenNames.get((random.nextInt(givenNames.size())) * (random.nextInt(2)));
    return surname + givenName + givenName2;
}
  1. 辅助类和异常
    NameData 类是一个简单的数据容器,用于存储从 JSON 文件中加载的姓氏和名字列表。
    NameDataLoadingException 是一个自定义异常类,当无法从 JSON 文件加载数据时抛出。
    使用方法
    创建 GenerateName 实例,并调用getRandomName方法来获取一个随机生成的中文姓名。

注意事项

  • 确保 /name.json 文件位于类路径上,并且格式正确。
  • getRandomName 方法假定 givenNames 列表至少包含两个名字。

实现源码:

  • GenerateName.java
/**
 * GenerateName 类用于从提供的姓名数据中随机生成姓名。
 */
package org.example.util;//导入后需要修改

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.List;
import java.util.Random;

public class GenerateName {
    private List<String> surnames; // 姓氏列表
    private List<String> givenNames; // 名字列表
    private final Random random = new Random(); // 用于生成随机数

    /**
     * GenerateName 的构造函数。在对象创建时自动加载姓名数据。
     * @throws NameDataLoadingException 如果无法从资源文件中加载姓名数据,则抛出异常。
     */
    public GenerateName() {
        try {
            ObjectMapper mapper = new ObjectMapper();
            NameData data = mapper.readValue(getClass().getResourceAsStream("/name.json"), NameData.class);
            this.surnames = data.getSurnames();
            this.givenNames = data.getGivenNames();
        } catch (IOException e) {
            throw new NameDataLoadingException("Failed to load name data from '/name.json'", e);
        }
    }

    /**
     * 随机生成一个姓名。
     * @return 返回一个由随机选择的姓氏和名字组成的字符串。
     */
    public String getRandomName() {
        // 从姓氏列表中随机选择一个姓氏
        String surname = surnames.get(random.nextInt(surnames.size()));

        // 从名字列表中随机选择一个或两个名字
        String givenName = givenNames.get(random.nextInt(1, givenNames.size()));
        String givenName2 = givenNames.get((random.nextInt(givenNames.size())) * (random.nextInt(2)));

        // 组合姓氏和名字并返回
        return surname + givenName + givenName2;
    }

    /**
     * NameData 内部类用于存储从 JSON 文件中加载的姓氏和名字数据。
     */
    private static class NameData {
        private List<String> surnames;
        private List<String> givenNames;

        public List<String> getSurnames() {
            return surnames;
        }

        public List<String> getGivenNames() {
            return givenNames;
        }
    }

    /**
     * NameDataLoadingException 是一个运行时异常类,用于在加载姓名数据失败时抛出。
     */
    public static class NameDataLoadingException extends RuntimeException {
        public NameDataLoadingException(String message, Throwable cause) {
            super(message, cause);
        }
    }
}

  • name.json
{
  "surnames": [
    "赵", "钱", "孙", "李", "周", "吴", "郑", "王",
    "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨",
    "朱", "秦", "尤", "许", "何", "吕", "施", "张",
    "孔", "曹", "严", "华", "金", "魏", "陶", "姜",
    "戚", "谢", "邹", "喻", "柏", "水", "窦", "章",
    "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
    "鲁", "韦", "昌", "马", "苗", "凤", "花", "方",
    "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐",
    "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤",
    "滕", "殷", "罗", "毕", "郝", "邬", "安", "常",
    "乐", "于", "时", "傅", "皮", "卞", "齐", "康",
    "伍", "余", "元", "卜", "顾", "孟", "平", "黄",
    "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪",
    "祁", "毛", "禹", "狄", "米", "贝", "明", "臧",
    "计", "伏", "成", "戴", "谈", "宋", "茅", "庞",
    "熊", "纪", "舒", "屈", "项", "祝", "董", "梁",
    "杜", "阮", "蓝", "闵", "席", "季", "麻", "强",
    "贾", "路", "娄", "危", "江", "童", "颜", "郭",
    "梅", "盛", "林", "刁", "钟", "徐", "邱", "骆",
    "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍",
    "虞", "万", "支", "柯", "昝", "管", "卢", "莫",
    "经", "房", "裘", "缪", "干", "解", "应", "宗",
    "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪",
    "包", "诸", "左", "石", "崔", "吉", "钮", "龚",
    "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁",
    "荀", "羊", "於", "惠", "甄", "曲", "家", "封",
    "芮", "羿", "储", "靳", "汲", "邴", "糜", "松",
    "井", "段", "富", "巫", "乌", "焦", "巴", "弓",
    "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬",
    "全", "郗", "班", "仰", "秋", "仲", "伊", "宫",
    "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎",
    "祖", "武", "符", "刘", "景", "詹", "束", "龙",
    "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄",
    "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂",
    "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙",
    "池", "乔", "阴", "郁", "胥", "能", "苍", "双",
    "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄",
    "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍",
    "却", "璩", "桑", "桂", "濮", "牛", "寿", "通",
    "边", "扈", "燕", "冀", "郏", "浦", "尚", "农",
    "温", "别", "庄", "晏", "柴", "瞿", "阎", "充",
    "慕", "连", "茹", "习", "宦", "艾", "鱼", "容",
    "向", "古", "易", "慎", "戈", "廖", "庾", "终",
    "暨", "居", "衡", "步", "都", "耿", "满", "弘",
    "匡", "国", "文", "寇", "广", "禄", "阙", "东",
    "欧", "殳", "沃", "利", "蔚", "越", "夔", "隆",
    "师", "巩", "厍", "聂", "晁", "勾", "敖", "融",
    "冷", "訾", "辛", "阚", "那", "简", "饶", "空",
    "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰",
    "巢", "关", "蒯", "相", "查", "后", "荆", "红",
    "游", "竺", "权", "逯", "盖", "益", "桓", "公",
    "晋", "楚", "闫", "鄢", "涂", "钦", "岳", "帅",
    "段", "干", "商", "牟", "佘", "赏", "阳", "佟",
    "墨", "哈", "谯", "爱", "万俟", "司马", "上官",
    "夏侯", "诸葛", "闻人", "东方",
    "赫连", "皇甫", "尉迟", "公羊",
    "澹台", "公冶", "宗政", "欧阳",
    "淳于", "单于", "太叔", "申屠",
    "公孙", "仲孙", "轩辕", "令狐",
    "钟离", "宇文", "长孙", "慕容",
    "鲜于", "闾丘", "司徒", "司空",
    "丌官", "司寇", "子车", "法汝",
    "颛孙", "端木", "巫马", "公西",
    "漆雕", "乐正", "壤驷", "公良",
    "拓跋", "夹谷", "宰父", "谷梁",
    "百里", "东郭", "呼延", "南宫",
    "梁丘", "左丘", "东门", "西门"

  ],
  "givenNames": [" ",
    "权", "羽", "月", "蒙", "朋", "略", "奎", "韵", "嘉", "方",
    "紫", "淼", "姗", "春", "炳", "纯", "麒", "彩", "洺", "顺",
    "凝", "宣", "辰", "诒", "家", "川", "恒", "谨", "可", "山",
    "璟", "棋", "丞", "雪", "晔", "献", "岩", "莲", "友", "振",
    "璐", "廷", "佩", "言", "学", "焘", "选", "昌", "俪", "洪",
    "章", "诗", "厚", "承", "雨", "儒", "珑", "芷", "歌", "旭",
    "生", "喜", "茂", "臻", "裕", "津", "华", "健", "声", "励",
    "菁", "佳", "勋", "萍", "汝", "勤", "梦", "跃", "雄", "若",
    "连", "毓", "霖", "霏", "冠", "菊", "芸", "崊", "聪", "育",
    "建", "和", "敬", "帆", "湾", "谋", "晨", "全", "偌", "靓",
    "雷", "骄", "继", "钊", "卫", "颖", "世", "显", "珊", "晴",
    "优", "函", "苒", "保", "阳", "儿", "莹", "映", "展", "北",
    "鹏", "琪", "标", "虹", "巧", "锋", "贤", "佚", "洁", "芳",
    "允", "康", "麟", "革", "与", "好", "巩", "玲", "道", "功",
    "泓", "冬", "孟", "珺", "渲", "瑾", "吉", "碧", "祥", "蔚",
    "露", "畅", "邦", "孝", "筱", "沛", "礼", "渺", "谱", "燕",
    "才", "岚", "照", "男", "珠", "婧", "政", "隆", "海", "开",
    "立", "骅", "谊", "美", "仪", "艳", "然", "为", "菡", "禾",
    "淇", "忻", "融", "爱", "勇", "韬", "尚", "忠", "理", "朝",
    "城", "启", "钧", "萱", "毅", "百", "荣", "长", "莉", "舒",
    "天", "黎", "罡", "昊", "万", "明", "曼", "婉", "娇", "传",
    "帅", "炜", "奇", "灿", "艺", "鲁", "梅", "纪", "怀", "营",
    "航", "容", "慧", "少", "骏", "希", "培", "申", "蓓", "国",
    "会", "昕", "丰", "旻", "汉", "巍", "彦", "兵", "垒", "潞",
    "翰", "清", "军", "伦", "冰", "诚", "绍", "同", "涛", "祺",
    "剑", "钦", "桂", "朗", "平", "涵", "誉", "贵", "琴", "棠",
    "凯", "臣", "志", "妹", "珮", "金", "焕", "加", "卉", "力",
    "钢", "备", "寿", "灵", "基", "娆", "凤", "子", "任", "中",
    "磊", "升", "曦", "安", "光", "雯", "如", "风", "定", "西",
    "琳", "济", "向", "发", "湘", "英", "源", "星", "非", "迅",
    "雅", "洋", "秀", "捷", "丛", "心", "雁", "进", "科", "望",
    "登", "智", "其", "波", "滔", "娴", "静", "真", "群", "伟",
    "锐", "凡", "枫", "桐", "怡", "倩", "盛", "竹", "珍", "时",
    "豪", "议", "亿", "斌", "璇", "珂", "洲", "琦", "宪", "漫",
    "堂", "君", "瀚", "兆", "常", "宁", "双", "笑", "先", "泰",
    "年", "有", "业", "溓", "瑜", "茜", "睿", "益", "泉", "涓",
    "蓉", "浩", "贝", "红", "泽", "晓", "延", "劲", "田", "逸",
    "影", "惠", "玟", "博", "蓝", "兰", "骁", "思", "玉", "克",
    "根", "伊", "彬", "小", "润", "敖", "牧", "皓", "江", "丽",
    "伯", "南", "盈", "彤", "馨", "萌", "鸿", "叶", "达", "沁",
    "晋", "品", "云", "采", "齐", "忆", "悦", "森", "瑷", "景",
    "腾", "晖", "耀", "威", "卿", "朦", "广", "镇", "依", "至",
    "石", "菏", "媛", "之", "亦", "起", "义", "梓", "松", "坤",
    "素", "芬", "赏", "杰", "昭", "丹", "材", "韦", "滨", "俊",
    "咏", "峰", "利", "轩", "香", "震", "名", "扬", "晗", "熙",
    "妮", "玮", "潇", "婷", "欣", "琛", "卓", "谦", "大", "彪",
    "锦", "兴", "策", "宗", "元", "铭", "多", "凌", "丫", "溪",
    "宏", "易", "福", "乐", "朔", "崇", "充", "沣", "亮", "州",
    "语", "鑫", "树", "青", "琸", "霞", "书", "翔", "德", "楚",
    "夫", "文", "超", "林", "玹", "恩", "行", "嫒", "富", "仁",
    "蕊", "奕", "宜", "鸣", "满", "柏", "蕾", "茗", "铁", "予",
    "愉", "来", "爽", "朵", "意", "甜", "宝", "晶", "聆", "芝",
    "宇", "久", "钰", "瑶", "逦", "运", "妍", "亭", "武", "一",
    "乔", "岳", "潮", "聚", "蔓", "水", "夏", "冉", "睻", "靖",
    "栋", "胜", "秋", "维", "虎", "颜", "彰", "姿", "正", "祖",
    "成", "良", "娟", "银", "坚", "晟", "日", "亚", "尧", "鹤",
    "东", "乃", "庆", "瑞", "信", "仲", "杨", "泊", "哲", "圣",
    "强", "霄", "珏", "微", "敏", "迎", "驰", "迪", "远", "赫",
    "伶", "京", "娜", "刚", "永", "龙", "舜", "飞", "菲", "高",
    "新", "莺", "越", "苹", "识", "庭", "怿", "民", "楠", "士",
    "征", "妙", "淑", "纶", "辉", "善", "锡", "化"
  ]
}

完~

### 如何在Java生成随机数据 为了满足不同场景的需求,在Java中有多种方式可以用来生成随机数或随机字符串。以下是几种常见的实现方法。 #### 使用`java.util.Random` 通过`Random`类中的各种方法可以直接获取到指定范围内的整型、浮点型等类型的数值: ```java import java.util.Random; public class RandomExample { public static void main(String[] args) { Random rand = new Random(); int randomNumber = rand.nextInt(100); // Generates an integer between 0 (inclusive) and 100 (exclusive) System.out.println("Generated Integer: " + randomNumber); double randomDouble = rand.nextDouble(); // Generates a floating-point number between 0.0 (inclusive) and 1.0 (exclusive) System.out.println("Generated Double: " + randomDouble); boolean randomBoolean = rand.nextBoolean(); // Generates either true or false randomly System.out.println("Generated Boolean: " + randomBoolean); } } ``` 这种方法简单易懂,适合大多数情况下快速生成简单的伪随机数[^1]。 #### 利用`ThreadLocalRandom` 当涉及到多线程环境时,推荐使用`ThreadLocalRandom`代替普通的`Random`对象,因为前者专门为并发编程设计,性能更好也更加安全: ```java import java.util.concurrent.ThreadLocalRandom; public class ThreadSafeRandomExample { public static void main(String[] args) { int minBound = 1; int maxBound = 100; int threadSafeRandomNumber = ThreadLocalRandom.current().nextInt(minBound, maxBound + 1); System.out.println("Thread-safe generated Integer within bounds [" + minBound + ", " + maxBound + "]: " + threadSafeRandomNumber); } } ``` 此段代码展示了如何在一个给定区间内获得一个均匀分布的随机整数[^2]。 #### 创建自定义长度的随机字母数字字符串 有时候应用程序需要创建唯一标识符或者其他形式的随机字符序列,这时可以通过组合大小写字母加数字的方式来构建这样的字符串: ```java import java.security.SecureRandom; public class SecureStringGenerator { private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; public static String generateSecureToken(int length){ StringBuilder tokenBuilder = new StringBuilder(length); SecureRandom secureRand = new SecureRandom(); for (int i=0; i<length ;i++){ int index = secureRand.nextInt(CHARACTERS.length()); char nextChar = CHARACTERS.charAt(index); tokenBuilder.append(nextChar); } return tokenBuilder.toString(); } public static void main(String[] args) { System.out.println("Generated Token: " + generateSecureToken(16)); } } ``` 这里采用了更为安全的方式——`SecureRandom`来确保产生的结果具有更高的不可预测性和安全性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值