產生身分證字號 ( 隨機 )
這篇文章會介紹使用 Python 的字典、串列、for 迴圈、random 和 if 判斷式,做出一個身分證字號產生器。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
身分證字號編碼規則
台灣身分證編碼的規則如下:
第 1 碼:行政區碼,不同行政區由不同的英文字母表示,每個英文字母對應一個二位數的數字,下圖為英文數字的對照表,主要可以參考「等價數值」數字 ( 參考「維基百科 中華民國國民身分證」 )。
第 2 碼:性別代碼,1 表示男生,2 表示女生。
第 3 碼~第 10 碼:八個 0~9 數字組成的流水號。
檢查規則:參考下圖的編碼計算規則,若最後 N 除以十可以整除,表示身分證號碼正確。
產生身份字號
身分證開頭的英文字,每個都有其對應的數字,所以使用「字典」的方式建立一個英文字和數字對照表,接著透過 random.choice 搭配 keys() 隨機取得 key 的名稱 ( 英文字母 ),再根據英文字母得到數字,透過檢查規則的數學式計算,最後就能得到身分證字號。
import random
# 列出字母對應的數字
local_table = {'A':1,'B':0,'C':9,'D':8,'E':7,'F':6,'G':5,'H':4,'I':9,
'J':3,'K':2,'L':2,'M':1,'N':0,'O':8,'P':9,'Q':8,'R':7,
'S':6,'T':5,'U':4,'V':3,'W':1,'X':3,'Y':2,'Z':0}
for i in range(10):
local = random.choice(list(local_table.keys())) # 取得隨機字母
sex = random.randint(1,2) # 性別
total = local_table[local]+sex*8 # 先將前兩個數字換算成的數字加總
result = f'{local}{sex}' # 結果使用 f-string 來組合字串
for i in range(1,8):
num = random.randint(0,9) # 重複八次每次都取出 0~9 隨機數字
total = total + num*(8-i) # 根據公式計算數值並加總到 total
result = f'{result}{num}' # 結果使用 f-string 來組合字串
num10 = 10 - total%10 # 最後一碼根據總值除以十是否整除來決定,如果不能整除,就是 10-餘數
if num10 == 10 : num10 = 0 # 如果能整除,最後一碼就是 0
result = f'{result}{num10} # 結果使用 f-string 來組合字串
print(result) # 印出結果
一次產生二十組身分證字號
如果加入 for 迴圈,就能夠一次產生 20 組隨機的身分證字號。
import random
local_table = {'A':1,'B':0,'C':9,'D':8,'E':7,'F':6,'G':5,'H':4,'I':9,
'J':3,'K':2,'L':2,'M':1,'N':0,'O':8,'P':9,'Q':8,'R':7,
'S':6,'T':5,'U':4,'V':3,'W':1,'X':3,'Y':2,'Z':0}
# 使用 for 迴圈
for i in range(20):
local = random.choice(list(local_table.keys()))
sex = random.randint(1,2)
total = local_table[local]+sex*8
result = f'{local}{sex}'
for i in range(1,8):
num = random.randint(0,9)
total = total + num*(8-i)
result = f'{result}{num}'
num10 = 10 - total%10
if num10 == 10 : num10 = 0
result = f'{result}{num10}'
print(result)
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~