最近閒着蛋疼實現了兩個庫。
我當然不會說去用各種人工智能去實現一個強大的的解析器然後生成,也不會說用一個非常龐大如搜狗拼音的姓名庫來隨機獲取——我只是偶然間知道蘑菇街小俠節一個混戰 PK 的 Demo 編寫比賽,閒來無聊隨便寫寫,然而這其中我需要隨機給 Bot 起名以及技能起名而用到的庫。
不需要有多少正確性——這兩個庫的結果經常出現非常奇葩的名字,讓人哭笑不得,但是我要的就是這種效果。
就兩個庫,我各生成一批名字以示效果。
1 | 闕造 |
1 | 地永心法 |
實際上無論是起名還是技能名,都用了一個相同的起名字庫和一段差不多的複用代碼(雖然沒有真正意義上的複用,只是複製粘貼而已,誰讓他們是兩個庫呢,已經很簡單了,我總不能再給他們搞一個依賴出來吧?)
關於 chinese-random-name
中的姓氏,我找了一箇中國百家姓(包括複姓)比較全的詞庫。
比較幸運,我找到的時候已經是這麼分段分好了。我也沒有詳細做研究,隨便給了不同的段不同的權值,當然越前面的段權值越高,被隨機到的可能性越大。
首先用 split
來分割不同段:
1 | dict = dict.split("\n\n"); |
對於每一段來說通過 Array.reduce
(詳見 SugarJs) 來分割成行再成字。
看字典一共有 6 大段,每段的權值分別爲:
1 | const weights = [ 100, 70, 10, 5, 1, 1 ]; |
然後每個字都有一個其權值區間,是累加上去的。
最後獲取姓的時候隨機生成一個在總區間內的數字,然後看看數字在哪個姓的區間內,就返回這個姓。
關於 chinese-random-skill
中的技能後綴,我偷懶了。因爲那個時候 Demo 就快 Deadline 了,所以隨便糊弄了一下——直接把印象裏面比較熟的後綴寫上去了事,也不給權值了。
1 | var suffix = [ |
名字主體爲兩個包的共用部分。
實際上他們依賴於一個特定款式的字庫——我也就網上隨便那麼一搜。
它每一行的結構一樣:
1 | Number UniChar UniChar:String |
其中第一個數字我目測是繁體的筆畫數,比如 899 行的 書
繁體就是 書
,數一下的確是 10 劃。
第二個就是字本體,第三個是該字的五行屬性,最後是這個字在什麼什麼命數(請不要迷信)描述。
爲了讓名字看起來稍微正常點(只是稍微而已),我儘可能讓同屬性的字在一塊兒,於是有了以下組合:
這些字湊在一起的權值爲 100。
然後隔一個屬性的話是相剋的,我不懂什麼起名大法什麼的,只是用膝蓋想了下相剋的屬性不好起名吧(猜錯了不要怨我),於是給了 20 的權值。
至於隔壁屬性,是相生吧?於是給了 50 權值。
對於三個字的起名來說,也是用了類似的方法給權值,具體可以參考代碼。
總之就是根據其兩兩之間的五行關係來起名的,聽起來還是有那麼點道理的。
哈哈,權當玩的,認真你就輸了。
上面的分步做完了,然後真·生成名字的步驟是:
隨機生成一個姓(或者技能後綴),然後按照某個權值隨機生成一個數字代表剩下的名字的長度,然後隨機生成一串該長度的名字即可。
最後拼接上去就 OK 了。
最後還是貼一下兩個包的 repo 地址吧:
以及安裝的話照下去弄就好了
1 | $ npm install chinese-random-name |
README
文件兩個包都有。