1. 程式人生 > >Java 隨機生成漢字

Java 隨機生成漢字

     漢字以兩個位元組儲存,稱為“區位碼”,高位叫區碼,低位叫位碼,有這倆位元組組成漢字。假設有一張漢字表,橫豎都是 94列,那麼區碼就相當於行,位碼就相當於列,根據行列就可以確定一個漢字了,這有點像二位陣列==,GB2312大致就是按照這種方式實現的,區碼1~9即前9行放的是特殊字元,16~55區放的是一級漢字,56~87區放的是二級漢字,其餘的暫時空餘。為了區別中文與西文字母,在中文字元首位以1開頭區分以0開頭的ASCII碼,GB2312給每個中文字元加上0xA0,因此,區碼從0xB0-0xF7 都是漢字,位碼範圍0xA0-0xFE 。

 漢字的unicode範圍是:0x4E00~0x9FA5

 漢字一、二級字型檔的漢字與unicode編碼(十六進位制)對照表: https://blog.csdn.net/zhoukejun/article/details/1937372

 第一種方法:unicode編碼

   public  static char getRandomChar(){
        return (char) (0x4e00 +(int)(Math.random()*(0x9fa5- 0x4e00+1))) ;
    }

  

 第二種方法:區位碼

 /**
     * 漢字以兩個位元組儲存,稱為“區位碼”,高位叫區碼,低位叫位碼,有這倆位元組組成漢字
     * @return
     */
    private static char getRandomChar2() {
        String str = "";

        //隨機數物件
        Random random = new Random();

        ///區碼,0xA0打頭,從第16區開始,即0xB0=11*16=176,16~55一級漢字,56~87二級漢字
        int hightPos = (176 + Math.abs(random.nextInt(39)));

        //位碼,0xA0打頭,範圍第1~94列
        int lowPos = (161 + Math.abs(random.nextInt(93)));

        //位元組碼
        byte[] b = new byte[2];
        b[0] = (Integer.valueOf(hightPos)).byteValue();
        b[1] = (Integer.valueOf(lowPos)).byteValue();

        try {
            //區位碼組合成漢字
            str = new String(b, "GBK");

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            System.out.println("錯誤");
        }
        //根據索引返回對應的字元
        return str.charAt(0);
    }

 

  測試產生20個漢字:

 

 

姓+名隨機產生

 public static void init() {
        /* 598 百家姓 */
        String[] names = {"趙", "錢", "孫", "李", "周", "吳", "鄭", "王", "馮", "陳", "褚", "衛", "蔣", "沈", "韓", "楊", "朱", "秦", "尤", "許",
                "何", "呂", "施", "張", "孔", "曹", "嚴", "華", "金", "魏", "陶", "姜", "戚", "謝", "鄒", "喻", "柏", "水", "竇", "章", "雲", "蘇", "潘", "葛", "奚", "範", "彭", "郎",
                "魯", "韋", "昌", "馬", "苗", "鳳", "花", "方", "俞", "任", "袁", "柳", "酆", "鮑", "史", "唐", "費", "廉", "岑", "薛", "雷", "賀", "倪", "湯", "滕", "殷",
                "羅", "畢", "郝", "鄔", "安", "常", "樂", "於", "時", "傅", "皮", "卞", "齊", "康", "伍", "餘", "元", "卜", "顧", "孟", "平", "黃", "和",
                "穆", "蕭", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "貝", "明", "臧", "計", "伏", "成", "戴", "談", "宋", "茅", "龐", "熊", "紀", "舒",
                "屈", "項", "祝", "董", "樑", "杜", "阮", "藍", "閔", "席", "季", "麻", "強", "賈", "路", "婁", "危", "江", "童", "顏", "郭", "梅", "盛", "林", "刁", "鍾",
                "徐", "邱", "駱", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", "虞", "萬", "支", "柯", "昝", "管", "盧", "莫", "經", "房", "裘", "繆", "幹", "解", "應",
                "宗", "丁", "宣", "賁", "鄧", "鬱", "單", "杭", "洪", "包", "諸", "左", "石", "崔", "吉", "鈕", "龔", "程", "嵇", "邢", "滑", "裴", "陸", "榮", "翁", "荀",
                "羊", "於", "惠", "甄", "曲", "家", "封", "芮", "羿", "儲", "靳", "汲", "邴", "糜", "鬆", "井", "段", "富", "巫", "烏", "焦", "巴", "弓", "牧", "隗", "山",
                "谷", "車", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宮", "寧", "仇", "欒", "暴", "甘", "鈄", "厲", "戎", "祖", "武", "符", "劉", "景",
                "詹", "束", "龍", "葉", "幸", "司", "韶", "郜", "黎", "薊", "溥", "印", "宿", "白", "懷", "蒲", "邰", "從", "鄂", "索", "鹹", "籍", "賴", "卓", "藺", "屠",
                "蒙", "池", "喬", "陰", "鬱", "胥", "能", "蒼", "雙", "聞", "莘", "黨", "翟", "譚", "貢", "勞", "逄", "姬", "申", "扶", "堵", "冉", "宰", "酈", "雍", "卻",
                "璩", "桑", "桂", "濮", "牛", "壽", "通", "邊", "扈", "燕", "冀", "浦", "尚", "農", "溫", "別", "莊", "晏", "柴", "瞿", "閻", "充", "慕", "連", "茹", "習",
                "宦", "艾", "魚", "容", "向", "古", "易", "慎", "戈", "廖", "庾", "終", "暨", "居", "衡", "步", "都", "耿", "滿", "弘", "匡", "國", "文", "寇", "廣", "祿",
                "闕", "東", "歐", "殳", "沃", "利", "蔚", "越", "夔", "隆", "師", "鞏", "厙", "聶", "晁", "勾", "敖", "融", "冷", "訾", "辛", "闞", "那", "簡", "饒", "空",
                "曾", "毋", "沙", "乜", "養", "鞠", "須", "豐", "巢", "關", "蒯", "相", "查", "後", "荊", "紅", "遊", "郟", "竺", "權", "逯", "蓋", "益", "桓", "公", "仉",
                "督", "嶽", "帥", "緱", "亢", "況", "郈", "有", "琴", "歸", "海", "晉", "楚", "閆", "法", "汝", "鄢", "塗", "欽", "商", "牟", "佘", "佴", "伯", "賞", "墨",
                "哈", "譙", "篁", "年", "愛", "陽", "佟", "言", "福", "南", "火", "鐵", "遲", "漆", "官", "冼", "真", "展", "繁", "檀", "祭", "密", "敬", "揭", "舜", "樓",
                "疏", "冒", "渾", "摯", "膠", "隨", "高", "皋", "原", "種", "練", "彌", "倉", "眭", "蹇", "覃", "阿", "門", "惲", "來", "綦", "召", "儀", "風", "介", "巨",
                "木", "京", "狐", "郇", "虎", "枚", "抗", "達", "杞", "萇", "折", "麥", "慶", "過", "竹", "端", "鮮", "皇", "亓", "老", "是", "祕", "暢", "鄺", "還", "賓",
                "閭", "辜", "縱", "侴", "万俟", "司馬", "上官", "歐陽", "夏侯", "諸葛", "聞人", "東方", "赫連", "皇甫", "羊舌", "尉遲", "公羊", "澹臺", "公冶", "宗正",
                "濮陽", "淳于", "單于", "太叔", "申屠", "公孫", "仲孫", "軒轅", "令狐", "鍾離", "宇文", "長孫", "慕容", "鮮于", "閭丘", "司徒", "司空", "兀官", "司寇",
                "南門", "呼延", "子車", "顓孫", "端木", "巫馬", "公西", "漆雕", "車正", "壤駟", "公良", "拓跋", "夾谷", "宰父", "穀梁", "段幹", "百里", "東郭", "微生",
                "樑丘", "左丘", "東門", "西門", "南宮", "第五", "公儀", "公乘", "太史", "仲長", "叔孫", "屈突", "爾朱", "東鄉", "相里", "胡母", "司城", "張廖", "雍門",
                "毋丘", "賀蘭", "綦毋", "屋廬", "獨孤", "南郭", "北宮", "王孫"};

        //隨機物件
        // Random r1 = new Random(long seed):使用單個 long 種子建立一個新的隨機數生成器。
        //預設當前系統時間的毫秒數作為種子數:Random r1 = new Random();
        //說明:你在建立一個Random物件的時候可以給定任意一個合法的種子數,種子數只是隨機演算法的起源數字,和生成的隨機數的區間沒有任何關係。
        Random random = new Random(System.currentTimeMillis());

        //random.nextInt(597)中的597是隨機數的上限,產生的隨機數為0-597的整數,不包括597。
        int index = random.nextInt(names.length - 1);
//        System.out.println(index);

        //陣列中的姓
        String name = names[index];

        //生成名字
        name += getRandomChar2();

        System.out.print(name+"\t");

    }

 

測試產生10個姓名: