Random 函式在批次造資料中的運用

kisom發表於2020-12-08

random 函式作為 python 中生成隨機資料的主要函式,在我們造資料的過程中有著非常廣闊的應用
以下是 random 函式的幾種主要用法:

print( random.randint(1,10) )        # 產生 1 到 10 的一個整數型隨機數  
print( random.random() )             # 產生 0 到 1 之間的隨機浮點數
print( random.uniform(1.1,5.4) )     # 產生  1.1 到 5.4 之間的隨機浮點數,區間可以不是整數
print( random.choice('tomorrow') )   # 從序列中隨機選取一個元素
print( random.randrange(1,100,2) )   # 生成從1到100的間隔為2的隨機整數
print random.sample('zyxwvnmlkjihgfedcba',5)  # 多個字元中生成指定數量的隨機字元

我以自己剛在新公司寫的一個指令碼為例:需要批次生成 C 端的賬號,我需要每次生成隨機的手機號、身份證號再去調註冊介面、認證介面。批次生成隨機的手機號和身份證號會有很多應用到 Random 函式的地方。
手機號碼:3 位字首 +8 位隨機數字
隨機取 3 位字首:

list = ['130','134','135','137','139','181','188','189']
        temp = random.choice(list)

8 位隨機數字,這裡提供 2 種寫法:

mobile = temp+''.join(random.choice("0123456789") for i in range(8))
mobile = temp + ''.join(random.sample(string.digits,8))

身份證號碼:6 位地區碼 + 出生日期 + 三位隨機數 + 權重位
6 位地區碼,如果想取值範圍廣一些,大家可以把地區碼寫到.txt 或者 excel 裡面去讀取,我這裡就隨機列了一些地區碼去取:

arealist = [ "440301","370600", "370601", "370602", "370611", "370612", "370613", "370634", "370681",
                                 "370682", "370683", ]
area = random.choice(arealist)

隨機生成出生日期,這裡我的方法是在一個範圍區間隨機取一個時間戳,但是 time.mktime() 方法有個坑,不能輸入 1970 年之前的日期:

start = (1971, 1, 17, 17, 3, 38, 1, 48, 0)
end = (2001, 12, 1, 12, 10, 10, 10, 10, 10)
start_time = time.mktime(start)
end_time = time.mktime(end)
s = random.randint(start_time,end_time)
toule = time.localtime(s)
birth = time.strftime("%Y%m%d",toule)

生成 3 位隨機數:

d = random.randint(100,999)

最後一位權重碼計算:

temp = area+str(birth)+str(id)
        count=0
        weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        checkcode = {0:'1',1:'0', 2:'X', 3:'9',4:'8',5:'7',6:'6',7:'5',8:'4',9:'3',10:'2'}
        for i in range(0,len(temp)):
            tes = int(temp[i])
            count = count+tes*weight[i]
        last = count%11
        lastcode = checkcode[last]
        IDcard = temp + ''.join(lastcode)

相關文章