目前比较全面且实用的Java中文名称批量生成器

目前比较全面且实用的Java中文名称批量生成器

生成结果

pinyinsurnamesexisSinglenameindex
tán|wă|qīngGIRL覃琬卿175
wéi|yánBOYtrue文言100
zhōng|jiān|shíBOY钟坚石56
xī|hŭ|qiānBOY奚虎千227
yuàn|hòu|chénBOY苑厚晨212
sī|tú|zhăn|miăo司徒BOY司徒展缈328
jī|ān|ruìBOY姬安瑞236
zuŏ|lùn|gùBOY左论固142
fáng|tāo|gēngBOY房韬耕198
zāng|yàng|qiánBOY臧漾钱214

实现功能

  1. 完全按照百家姓的排名顺序进行随机生成,排名考前的生成概率是后一个的N倍,且N可以自定义;
  2. 包含300个单姓及82个复姓,合计382个中文姓氏;
  3. 支持生成名字中男女比例的设置;
  4. 支持男女名字的单独逻辑生成,避免名字与性别不符;
  5. 支持生成名字中单字名字与双字名字的比例设置(单姓及复姓同时根据男女比例进行分配);
  6. 支持中文拼音;
  7. 支持输出姓氏在百家姓的排名顺序
  8. 支持生成规则的设置,目前支持如下五种生成规则:
    • 常用男女名称字符大全
    • 常用男女名称大全
    • GB2312字符集中文汉字
    • GBK字符集中文汉字
    • UTF-8字符集中文汉字

关键代码

 /**
       * @title 批量生成名字
       * @author liangxin
       * @param count  生成总数量1~10000之间
       * @param femaleRate 女性占比 0~100整数
       * @param singleRate 单名字占比 0~100整数
       * @param rule FIXED:固定组合 GROUP:常用字组合 GB2312:GB2312 GBK:GBK RANDOM:随机规则
       * @return
    * @throws BadHanyuPinyinOutputFormatCombination 
    * @throws UnsupportedEncodingException 
       */
      
    public static List<Map<String,Object>> batchGenName(int count,int femaleRate, int singleRate,String rule) throws BadHanyuPinyinOutputFormatCombination, UnsupportedEncodingException {
   	List<Map<String,Object>> names = new ArrayList<Map<String,Object>>();
   	//检验参数合法性
   	count = count >=1 && count <= 10000?count:10;
       femaleRate = femaleRate >=0 && femaleRate <= 100?femaleRate:50;
       singleRate = singleRate >=0 && singleRate <= 100?singleRate:10;
   	//循环生成
       String sex = "GIRL";
       Boolean isSingle = false;
       double rateTemp= 0D;
       double rateCompare = 0D;
       int singleCount = 0;
       int singleTotalCount  = count*singleRate/100;
       int singleGirlCount  = count*femaleRate*singleRate/10000;
       Map<String,Object> nameMap = new HashMap<String,Object>();
   	for (int i = 0; i < count; i++) {
   		Map<String,Object> map = new HashMap<String,Object>();
   		rateTemp =  (double)(i+1)/count;
   		rateCompare = Math.round(rateTemp * 500); 
   		sex =  rateCompare <= femaleRate?"GIRL":"BOY";
   		if("GIRL".equals(sex)){
   			if(singleCount< singleGirlCount) {
   				isSingle = true;
   				singleCount ++;
   			}else {
   				isSingle = false;
   			}
   		}else {
   			if(singleCount < singleTotalCount) {
   				isSingle = true;
   				singleCount ++;
   			}else {
   				isSingle = false;
   			}
   		}
   		nameMap = genName(sex,rule,isSingle);
   		map.put("sex", sex);
   		map.put("isSingle", isSingle);
   		map.put("name", nameMap.get("name"));
   		map.put("surname", nameMap.get("surname"));
   		map.put("index", nameMap.get("index"));
   		map.put("pinyin", ChinesePinyin.getChinesePinyin(""+nameMap.get("name")));
   		names.add(map);
   	}
   	 return names;
    }

通过等比数列实现百家姓常用姓氏的概率翻倍

public static  int getRandomNumber(int n, int m) {
	    // 权重数组,权重为前一个数的m倍
	    //梁新说明:类似与数学中的等比递增数列,前一个是后m倍,概率就高出m倍,但是要确保最后一个数值必须大于倒数第二个数字加1,否则会出现更多重复且排名靠后的姓氏。
	    int[] weights = new int[n];
	    weights[0] = 1;
	    for (int i = 1; i < n; i++) {
	        weights[i] =  weights[i-1] + m*(n-i);
	    }
//	    System.out.println(JSONObject.toJSONString(weights));
	    // 求和得到总权重 
	    int totalWeight = 0;
	    for (int weight : weights) {
	        totalWeight += weight;
	    }
	    // 生成一个范围在1~totalWeight之间的随机数
	    int randomWeight = new Random().nextInt(totalWeight) + 1;  
	    
	    // 遍历权重数组,判断随机数落在哪个权重范围内
	    int number = 0; 
	    int sum = 0;
	    for (int i = 0; i < weights.length; i++) {
	        sum += weights[i]; 
	        if (randomWeight <= sum) {
	            number = i + 1;
	            break;
	        }
	    }
	    
	    return number;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值