别再告诉好名字都让狗取了!——Go语言打造起名系统,拿去叫我雷锋

论坛 期权论坛 脚本     
匿名技术用户   2020-12-22 00:29   20   0

需求简介

  • 能胡乱地随机生成姓名,并且听起来像那么回事儿~
  • 代码能复用到各种项目中,比如游戏NPC的起名等;

整体实现思路

  • 很多中国人的姓名构成如下:姓氏+辈分字+名字,例如朱镕基,朱是姓氏,镕是字辈,基是名字;于是:
  • 从百家姓中胡乱抽取一个,生成随机的姓氏;
  • 从千字文中胡乱抽取一个,作为随机名字;
  • 不同姓氏的辈分可以上网查询,下图展示的是湖南欧阳氏的辈分列表,我们可以建立一个map,通过姓氏查询到该姓氏的全部字辈,并胡乱抽取一个作为姓名的中间字;
    在这里插入图片描述

代码实现
数据准备

/*定义姓、辈、名的数据容器*/
var (
 //定义一堆姓氏
 familyNames = []string{"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "楚", "卫", "蒋", "沈", "韩", "杨", "张", "欧阳", "东门", "西门", "上官", "诸葛", "司徒", "司空", "夏侯"}
 
 //创建辈分字典,姓氏为键,该姓氏的全部【辈分字切片】为值
 middleNamesMap = map[string][]string{}
 
 //定义一堆名字
 lastNames = []string{"春", "夏", "秋", "冬", "风", "霜", "雨", "雪", "木", "禾", "米", "竹", "山", "石", "田", "土", "福", "禄", "寿", "喜", "文", "武", "才", "华"}
)

/*
在包的初始化方法中,为不同姓氏配置不同辈分字切片
这里桫哥模拟的是为欧阳氏添加“宗的永其光”五个辈分字,其余的是乱扯的~
*/
func init() {
 for _, x := range familyNames {
  if x != "欧阳" {
   middleNamesMap[x] = []string{"德", "惟", "守", "世", "令", "子", "伯", "师", "希", "与", "孟", "由", "宜", "顺", "元", "允", "宗", "仲", "士", "不", "善", "汝", "崇", "必", "良", "友", "季", "同"}
  } else {
   middleNamesMap[x] = []string{"宗", "的", "永", "其", "光"}
  }
 }
}

于是我们胡乱抽取姓氏和名字,辈分字先根据姓氏查询到对应的切片,再从切片里乱抓一个,实现如下:

func GetRandomName() (name string) {
 familyName := familyNames[GetRandomInt(0, len(familyNames)-1)]
 middleName := middleNamesMap[familyName][GetRandomInt(0, len(middleNamesMap[familyName])-1)]
 lastName := lastNames[GetRandomInt(0, len(lastNames)-1)]
 return familyName + middleName + lastName
}

上面我们用到了一个获取随机数的函数func GetRandomInt(start, end int) int,它能从[start,end]之间抓取随机整数,其实现如下:

var(
 //随机数互斥锁(确保GetRandomInt不能被并发访问)
 randomMutex sync.Mutex
)

/*获取[start,end]之间的随机数*/
func GetRandomInt(start, end int) int {
 //访问加同步锁,是因为并发访问时容易因为时间种子相同而生成相同的随机数,那就狠不随机鸟!
 randomMutex.Lock()

 //利用定时器阻塞1纳秒,保证时间种子得以更改
 <-time.After(1 * time.Nanosecond)

 //根据时间纳秒(种子)生成随机数对象
 r := rand.New(rand.NewSource(time.Now().UnixNano()))
 //得到[start,end]之间的随机数
 n := start + r.Intn(end-start+1)

 //释放同步锁,供其它协程调用
 randomMutex.Unlock()
 return n
}

让我们一起去浪(Golang)~

func main() {
 for i:=0;i<10 ;i++  {
  fmt.Println(utils.GetRandomName())
 }
}

在这里插入图片描述

酷毙了有木有?!赶快加入【兄弟连区块链帝国】吧我的朋友(就问你这个广告硬不硬!)
在这里插入图片描述

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP