目前比较全面且实用的Java中文名称批量生成器
生成结果
pinyin | surname | sex | isSingle | name | index |
---|
tán|wă|qīng | 覃 | GIRL | | 覃琬卿 | 175 |
wéi|yán | 文 | BOY | true | 文言 | 100 |
zhōng|jiān|shí | 钟 | BOY | | 钟坚石 | 56 |
xī|hŭ|qiān | 奚 | BOY | | 奚虎千 | 227 |
yuàn|hòu|chén | 苑 | BOY | | 苑厚晨 | 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ēng | 房 | BOY | | 房韬耕 | 198 |
zāng|yàng|qián | 臧 | BOY | | 臧漾钱 | 214 |
实现功能
- 完全按照百家姓的排名顺序进行随机生成,排名考前的生成概率是后一个的N倍,且N可以自定义;
- 包含300个单姓及82个复姓,合计382个中文姓氏;
- 支持生成名字中男女比例的设置;
- 支持男女名字的单独逻辑生成,避免名字与性别不符;
- 支持生成名字中单字名字与双字名字的比例设置(单姓及复姓同时根据男女比例进行分配);
- 支持中文拼音;
- 支持输出姓氏在百家姓的排名顺序
- 支持生成规则的设置,目前支持如下五种生成规则:
- 常用男女名称字符大全
- 常用男女名称大全
- GB2312字符集中文汉字
- GBK字符集中文汉字
- UTF-8字符集中文汉字
关键代码
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) {
int[] weights = new int[n];
weights[0] = 1;
for (int i = 1; i < n; i++) {
weights[i] = weights[i-1] + m*(n-i);
}
int totalWeight = 0;
for (int weight : weights) {
totalWeight += weight;
}
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;
}