隨機生成常用漢字(改進版)


引言

我在兩個月前寫了一篇隨筆“隨機生成常用漢字”,生成漢字的來源是國標(GB2312)一級字(共3755字)。園友 Aimeast 在評論中說:

並不是一級漢字中的漢字就是常用的。最好的辦法是從豐富的樣本中進行統計分析后得出哪些是常用漢字。

正好,國家語言文字工作委員會和國家教育委員會於1988年1月26日發布了《現代漢語常用字表》,共3500字,是從1928年至1986年的豐富的樣本中進行統計分析后得到的。

我在這個月中旬寫了一篇隨筆“現代漢語常用字與國標一級的比較”。經比較發現,現代漢語常用字中有126字是國標一級字中沒有的,國標一級字中有381字是現代漢語常用字中沒的。

隨機生成常用漢字的 C# 程序(改進版)

根據上述討論,就很容易寫出從現代漢語常用字中隨機生成漢字的程序,如下所示:

 1 using System;
 2 using System.Text;
 3 using System.Linq;
 4 using System.Collections.Generic;
 5 
 6 namespace Skyiv.Utils
 7 {
 8   static class ChineseCreator
 9   {
10     static void Main(string[] args)
11     {
12       var count = (args.Length > 0) ? int.Parse(args[0]) : 1800;
13       var isGB2312 = args.Length > 1 && args[1] == "from3755";
14       var str = isGB2312 ? GetGB2312String() : GetChineseString();
15       var random = new Random();
16       var sb = new StringBuilder(count);
17       for (var len = str.Length; count > 0; count--)
18         sb.Append(str[random.Next(len)]);
19       Console.WriteLine(sb);
20     }
21 
22     // 現代漢語常用字(共3500個)
23     static string GetChineseString()
24     {
25       var set = new HashSet<char>(GetGB2312String());
26       set.ExceptWith("皚胺盎敖翱佰稗鎊鮑鋇苯甭迸毖敝陛卞斌擯炳缽鉑箔帛蔡搽詫讒掣郴騁熾躊瞅躇滁" +
27          "搐椽疵茨躥瘁淬磋傣殆鄲憚迪狄翟滇靛凋迭侗恫犢遁掇剁峨娥厄鄂洱琺藩釩酚汾烽氟涪弗釜腑阜訃噶" +
28          "嘎贛皋鉻庚龔蠱剮圭癸輥骸氦邯郝菏貉閡涸亨弘瑚桓豢磺簧卉燴姬緝汲薊伎悸箋緘礆檻餞鉸桔睫藉疥" +
29          "靳燼粳痙炯廄咎狙疽咀踞娟撅攫抉浚郡喀咯亢柯儈匡巋奎饋婪闌讕佬鐳磊傈漣撂廖霖拎羚隴擄麓潞祿" +
30          "戮攣孿灤綸嘛謾卯酶鎂寐醚冪抿牟氖淖妮霓倪拈嚙鎳涅哦漚啪琶磐耪呸裴抨砒琵毗痞瞥粕莆埔曝沏祁" +
31          "訖扦釺仟塹羌薔橇鞘沁氰邱酋泅齲顴醛炔榷冉壬妊戎茹孺汝阮鰓莎煽汕繕墒韶邵懾砷娠噬仕孰戍舜朔" +
32          "嗣巳慫擻僳隋綏蓑獺撻酞坍絛銻嚏腆迢眺烴汀酮湍陀哇烷皖韋惟濰渭撾斡鎢吾毋戊硒矽嘻烯汐檄襄霄" +
33          "忻惺墟戌噓眩絢丫焉閹彥佯瘍瑤堯噎耶曳銥頤沂彝矣臆裔詣翌蔭寅尹臃癰雍恿鈾酉釉盂虞俞渝禹峪馭" +
34          "垣苑曰鄖匝哉札咋詹輾湛漳瘴肇蟄鍺甄砧臻幀峙炙痔謅誅矚拽篆茲淄孜漬鬃鄒纂佐柞");
35       set.UnionWith("叨蜓箏蜻橘匕丐夭嘰吆鳧阱芙杈嶇鳩沐姊卦拗茉曇餚衩玷茴蕎薺盹咧昵咪秕朧奕颯炫" +
36          "祠荸鶯樺嘮蚣蚪蚓唧秫麩捺匾蚯蛉啰銬鐺笙笤偎徙翎庵涮悴襠謁靂跛銼掰牘腌蝟愕鵡蒿欖楣嗦蹺蜈嗤" +
37          "饃稟繽榛榕嘁嘀幔簫漩橄嘹蝠蝌蝙鯽憔翩嬉繚薇噩蟥霎踱蹂蟆螃鸚癮韁檐檁瞭蟋蟀朦臊鱷鰭癩璧簸鬢躪");
38       return new string(set.ToArray());
39     }
40     
41     // 國標一級字(共3755個): 區:16-55, 位:01-94, 55區最后5位為空位
42     static string GetGB2312String()
43     {
44       var list = new List<byte>();
45       for (var 區 = 16; 區 <= 55; 區++)
46         for (int 位2 = (區 == 55) ? 89 : 94, 位 = 1; 位 <= 位2; 位++)
47         {
48           list.Add((byte)(區 + 0xa0));
49           list.Add((byte)(位 + 0xa0));
50         }
51       return Encoding.GetEncoding("GB2312").GetString(list.ToArray());
52     }
53   }
54 }

上述程序中:

  • 第41到52行的 GetGB2312String 方法生成3755個國標一級字。
  • 第22到39行的 GetChineseString 方法生成3500個現代漢語常用字。該方法首先生成3755國標一級字,然后排除381個漢字,接着增加126個漢字。
  • 第12行:該程序的第一個命令行參數(如果有的話)表示需要生成的漢字個數,默認是1800個。
  • 第13行:該程序的第二個命令行參數(如果有的話)表示所生成的漢字的來源,默認是現代漢語常用字。

編譯和運行

在 Arch Linux 和 Mono 2.10.8 環境下編譯和運行:

work$ uname -a
Linux s4700 3.6.10-1-ARCH #1 SMP PREEMPT Tue Dec 11 09:40:17 CET 2012 x86_64 GNU/Linux
work$ dmcs --version
Mono C# compiler version 2.10.8.0
work$ dmcs ChineseCreator.cs
work$ mono ChineseCreator.exe 500
抖煞鼻緩官機俯撰拒陽導偉慘膽票溜求婆初潰獄刺嗽澎廟梧旱瘟劇曙辱蕭判行貞過庫蔑瓊裹震誘然瀑脆吹仲灘袱雞疾川使藏特看遲館傑棕載塗累竄譽喊斗瘧捌瘤美欲究兄崇謝米搔焰摧飼罷歷砍未又胯莉運騰沖飲猛殿閑勃屁饃碼槳勝絹移趁詩晦塘虎嬌懸濁蟀酵柿源表海鴻禁椰偷砍彩唐嗦聰辯湖翻敘戳崗蛔梆蹈琢談顯媒套飾怠柴操桌瓦楣巷介松懊花陝舒葛輛扯衍指叔蠕棗刑施凡音苫胡漱泛瑰茫氈筍鴦陸物粒密魁備擱揀配胳扶吏豎夜候刻諒擔跡瞞訪輔攔古萍株懶稼症史心擲承餾磅疤鱗拙趟壞泛諧捏閥組速跟庇篡缸遙杜撰辯必摩溯庄駱懇桑故射何幣酪越廟疑溶鍛筐扒誠哨苞梗疚諷卜祭斂宜青貝切金燕榔深賜拯燈除村寫橡聊豈阱淪吟壹餐秕裂紀梨把萌洞癢全堰虎水儲咆電含少妙斬游爹激片蜘防幅馱旋晉屯鑰茫驗榜假渴蒙旋濤陡俺聖絆毫植牙嘿雁憨決好勢陪悼妒率忍悔穿飾座襟盯凌淹侍事葉琴濺籽囂規巧獅捏細狸泄亡三陋突涕臀瞧件淚袱嗽萎甚哈懇朵公辣洛身慮擦夷辟瘧晰軒齋淹礫任登蜂痴令躍懇臭掀護色撼氛構誕洪碘蝸挖徐循拳珍箏鈣蕊鐮駒悔釁經蒙菩帝擾量企烙打村雹彌塑輸銹銬措乙牘噪精滿壽北茶貸染勃南跋韭駐專雙過等囚拼梁宏蝶匯載虛貿捐斟暫戰撐靶揩徙滑掠康牧語浴買舀搬贅役芙慰鍬翼匪綠炸肝氈侮岳賺搔咳取替牲踢
work$ mono ChineseCreator.exe 500 from3755
振拐浦孩幀梗撇拂耿戲糾顱勝漱逆典吁燕酣福系氨酒甚液淖韶肢譚嘉贊硝豆結俘林少器蜜捉竿翅熊奏劑唁僻胯惕編洛嘩盎析摸蝶辰隔玻氖敲椎譚罐崎恨墒示巨庶秦漠戴鈣頭沫尊鞘吊嘆梁楞淵馮艇漳侈哉悟棧效追負匈誇毯帚確荷邪楊腫櫃笆攘玻鈞惺憋浦簿垛嚨粹炭顴晰迂洋沂霍貝礦粕雪鰓夯賜渠舜當非刨嗆省鶴粥夏萌逮度涪側閱膳悟鍬申姿毋窿曳胺前漱嗜傈視九介臣且艦噪蠟腋儲旁霉掌般當淵嘲朗臨包羞優多俘氫危憾趨咆依辱番鑲噸鐮棘披椿狽惑姿螟馮王屋瘟噓棋腋創旺壯燈肖邪們棲煩詩磺稀行決潑蔥壁煌沸孩娟臣吶騙狡蝴亞妄矩塊椿放長甄翰晨諧邪估撥懇稗舅業是缸莽真依饅詹奧虜爾望澡樹筆影蹄做瞬澆淡鶴虹澇侄淌疥膳稠哩桃奸救搔繳蠍雷渠消詣娠快隸窯震吮啄叔癢沖有累匯且審潘積峭遞弟凌音檔滌薪溪檻插停鏡漁餅疊翹羚趟諸吮污狸浪胃面汁墜炎氛隔銹蘋貿今姻羚貯邱鬼延蘭古探汲豫鐮說蹈灶揭卻蟹緊唱五牆誓初作巳緞桿嘔美誓密沈怯刁天圓枷獻杉顫摯摻攪淄耘昏勇掩末材雀剝醉巳炕項渴嚨您占疇凌場溝者痙襟典笆遍屜腫宴板鍛平恃郎容佑息紊翱琵曝斌乞揪赴局憑墮檄且經租供稼玄鯨沙饅耕認喚驗班令達狡耕爆鬼杜君喳首蒙嬰征彈憊監示酪櫃哇構兔嫁跑羔回桓手汪內洋二芍扛成玫翰骨鈕謠錯二春酣鑽淺牧信佬防者
work$ 

第一次運行從3500個現代漢語常用字中隨機生成500個漢字。第二次運行從3755個國標一級字中隨機生成500個漢字。看起來這兩次運行差別不大,說不上哪次生成的漢字更常用些。因為現代漢語常用字和國標一級字的大部分都是相同的。國標一級字其實也是從豐富的樣本中統計出來的常用字。

參數資料

  1. 博客園: 隨機生成常用漢字
  2. 博客園: 現代漢語常用字與國標一級字的比較


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM