第一種方法:Unicode碼
在unicode碼中,漢字的范圍是(0x4E00, 9FBF)
import random
def Unicode():
val = random.randint(0x4e00, 0x9fbf)
return chr(val)
這個方法有個小問題,unicode碼中收錄了2萬多個漢字,包含很多生僻的繁體字.
第二種方法:GBK2312
gbk2312對字符的編碼采用兩個字節(jié)相組合,第一個字節(jié)的范圍是0xB0-0xF7, 第二個字節(jié)的范圍是0xA1-0xFE.
對GBK2312編碼方式詳細的解釋請參看GBK2312編碼
import random
def GBK2312():
head = random.randint(0xb0, 0xf7)
body = random.randint(0xa1, 0xf9) # 在head區(qū)號為55的那一塊最后5個漢字是亂碼,為了方便縮減下范圍
val = f'{head:x}{body:x}'
str = bytes.fromhex(val).decode('gb2312')
return str
GBK2312收錄了6千多常用漢字.兩種方法的取舍就看需求了.
原博:http://www.reibang.com/p/73bf99e37ca2
需求:隨機生成兩字或三字的名字
思路1:姓后面的第一個名泽疆,用數組隨機取數蕴掏,數組第一個數據為隨機的中文字符(調用上述函數)介陶,第二個數據為空字符效扫,隨機取數取到空字符就是兩字名字菲盾,取到非空字符就是三字名字
思路2:for循環(huán)生成中文字符的函數,然后進行str拼接粘都,循環(huán)次數為隨機生成[1-2]隨機整數不跟,隨機到1,則為二字名字励堡,隨機到2谷丸,則為三字名字(4字名字類推)
思路1代碼:
import random
def GBK2312():
head = random.randint(0xb0, 0xf7)
body = random.randint(0xa1, 0xf9) # 在head區(qū)號為55的那一塊最后5個漢字是亂碼,為了方便縮減下范圍
val = f'{head:x}{body:x}'
st = bytes.fromhex(val).decode('gb2312')
return st
def first_name(): # 隨機取姓氏字典
first_name_list = [
'趙', '錢', '孫', '李', '周', '吳', '鄭', '王', '馮', '陳', '褚', '衛(wèi)', '蔣', '沈', '韓', '楊', '朱', '秦', '尤', '許',
'何', '呂', '施', '張', '孔', '曹', '嚴', '華', '金', '魏', '陶', '姜', '戚', '謝', '鄒', '喻', '柏', '水', '竇', '章',
'云', '蘇', '潘', '葛', '奚', '范', '彭', '郎', '魯', '韋', '昌', '馬', '苗', '鳳', '花', '方', '俞', '任', '袁', '柳',
'酆', '鮑', '史', '唐', '費', '廉', '岑', '薛', '雷', '賀', '倪', '湯', '滕', '殷', '羅', '畢', '郝', '鄔', '安', '常',
'樂', '于', '時', '傅', '皮', '卞', '齊', '康', '伍', '余', '元', '卜', '顧', '孟', '平', '黃', '和', '穆', '蕭', '尹',
'姚', '邵', '堪', '汪', '祁', '毛', '禹', '狄', '米', '貝', '明', '臧', '計', '伏', '成', '戴', '談', '宋', '茅', '龐',
'熊', '紀', '舒', '屈', '項', '祝', '董', '梁']
n = random.randint(0, len(first_name_list) - 1)
f_name = first_name_list[n]
return f_name
def second_name():
# 隨機取數組中字符,取到空字符則沒有second_name
second_name_list = [GBK2312(), '']
n = random.randint(0, 1)
s_name = second_name_list[n]
return s_name
def last_name():
return GBK2312()
def create_name():
name = first_name() + second_name() + last_name()
return name
print(create_name())
思路2代碼:
def create_name():
n = random.randint(1, 2)
name = ''
for i in range(n):
s = GBK2312()
name = name+s
return first_name()+name
優(yōu)化后版本(2023.5.19更新):
random.choice()從序列中獲取一個隨機元素应结,其原型為random.choice(sequence)刨疼,參數sequence表示一個有序類型。這里說明一下鹅龄,sequence在Python中不是一種特定的類型揩慕,而是泛指序列數據結構。列表扮休,元組漩绵,字符串都屬于sequence
second_name = random.choice([GBK2312(), ''])
def GBK2312():
head = random.randint(0xb0, 0xf7)
body = random.randint(0xa1, 0xf9) # 在head區(qū)號為55的那一塊最后5個漢字是亂碼,為了方便縮減下范圍
val = f'{head:x}{body:x}'
st = bytes.fromhex(val).decode('gb2312')
return st
def create_name():
first_name_list = [
'趙', '錢', '孫', '李', '周', '吳', '鄭', '王', '馮', '陳', '褚', '衛(wèi)', '蔣', '沈', '韓', '楊', '朱', '秦', '尤', '許',
'何', '呂', '施', '張', '孔', '曹', '嚴', ]
f_name = random.choice(first_name_list)
name = f_name + random.choice([GBK2312(), '']) + GBK2312()
return name
print(create_name())