產生身分證字號 ( 隨機 )
這篇文章會介紹使用 Python 的字典、串列、for 迴圈、random 和 if 判斷式,做出一個身分證字號產生器。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
身分證字號編碼規則
台灣身分證編碼的規則如下:
第 1 碼:行政區碼,不同行政區由不同的英文字母表示,每個英文字母對應一個二位數的數字,下圖為英文數字的對照表。
第 2 碼:性別代碼,1 表示男生,2 表示女生。
第 3 碼~第 9 碼:七個 0~9 數字組成的流水號。
第 10 碼:檢查碼,產生方式按照下圖的規則,依據前面代碼計算出檢查碼。
產生身份字號
身分證開頭的英文字,每個都有其對應的數字,所以使用「字典」的方式建立一個英文字和數字對照表,接著透過 keys() 搭配 list(),將 A~Z 的鍵取出成為串列,接著使用 random.choice() 隨機取出一個英文字。
import random # import random 模組
# 建立英文字和數字對照表
local_table = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'I':34,
'J':18,'K':19,'L':20,'M':21,'N':22,'O':35,'P':23,'Q':24,'R':25,
'S':26,'T':27,'U':28,'V':29,'W':32,'X':30,'Y':31,'Z':33}
local = random.choice(list(local_table.keys())) # 隨機取出一個區域英文字
得到英文字之後,新增一個 check_arr 串列 ( 負責第十碼的轉換 ),串列的內容由英文對應的數字產生,產生的方式先將數字轉換成「字串」,接著使用 list 將字串拆分成串列,再將一一將串列的項目轉換成「數字」 ( 因為數字無法直接轉換成串列 )。
check_arr = list(str(local_table[local])) # 將數字轉成字串,再將字串拆解成串列
check_arr[0] = int(check_arr[0]) # 將串列的第一個項目轉換成數字
check_arr[1] = int(check_arr[1]) * 9 # 將串列的第一個項目轉換成數字並乘以 9 ( 根據第十碼的產生規則 )
新增一個 sex 變數,由隨機取出 1 或 2,接著將數字乘以 8 之後放入 check_arr 串列裡 ( 根據第十碼的產生規則 )。
sex = random.choice([1,2]) # 隨機取出 1 或 2
check_arr.append(sex * 8) # 乘以 8 之後加入串列
新增一個 nums_str 變數,負責記錄第三碼到第九碼總共七碼的流水編號,建立的方法使用重複七次的 for 迴圈,每次重複時產生一個隨機數,同時根據第十碼的產生規則,依序乘以 7~1 的數字後加入 check_arr 串列裡。
nums_str = '' # 建立 nums_str 變數,內容為空字串
for i in range(7): # 重複七次的 for 迴圈
nums = random.randint(0, 9) # 產生 0~9 的隨機整數
nums_str = nums_str + str(nums) # 將整數轉換成字串,連接在 nums_str 後方
check_arr.append(nums*(7-i)) # 根據第十碼的產生規則,依序乘以 7~1 的數字。加入 check_arr 串列
新增 check_num 變數,運算第十碼的數值,最後將所有代碼組合起來,就產生一組身分證字號。
參考:sum
check_num = 10 - sum(check_arr)%10 # 根據第十碼產生規則產生
if check_num == 10: # 如果等於 10,檢查碼就等於 0
check_num = 0
id_number = str(local) + str(sex) + nums_str + str(check_num) # 組合成身分證字號
print(id_number)
一次產生二十組身分證字號
如果加入 for j in range(20) 的迴圈,就能夠一次產生 20 組隨機的身分證字號。
import random
local_table = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'I':34,
'J':18,'K':19,'L':20,'M':21,'N':22,'O':35,'P':23,'Q':24,'R':25,
'S':26,'T':27,'U':28,'V':29,'W':32,'X':30,'Y':31,'Z':33}
for j in range(20): # 使用 20 次的 for 迴圈
local = random.choice(list(local_table.keys()))
check_arr = list(str(local_table[local]))
check_arr[0] = int(check_arr[0])
check_arr[1] = int(check_arr[1]) * 9
sex = random.choice([1,2])
check_arr.append(sex * 8)
nums_str = ''
for i in range(7):
nums = random.randint(0, 9)
nums_str = nums_str + str(nums)
check_arr.append(nums*(7-i))
check_num = 10 - sum(check_arr)%10
if check_num == 10:
check_num = 0
id_number = str(local) + str(sex) + nums_str + str(check_num)
print(id_number)
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~