產生身分證字號 ( 隨機 )
這篇文章會介紹使用 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)
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~