如何生成1億個手機號碼?Python生成隨機數的22種方法,random函式太強了~
大家好,這裡是Python程式設計師晚楓。
案例解析
最近在網上看到一個python的面試題目:如何用Python生成1億個手機號碼?
我第一眼看到的時候心想,這個還不簡單?直接random.randint(1,999999999999)
就完事了。
但是馬上就發現了這其中的錯誤:這個是生成1-99999999之間的隨機數,可能是1,也可能是666.
但電話號碼是11位的,而且前3位只有指定的號段,比如135、136。直接random.randint(1,999999999999)
這麼做並不符合條件。
那麼如何生成呢?於是有了下面這段程式碼:
import random
def create_phone_num(num):
all_phone_nums = set() # 存放生成的電話號碼
while True: # 因為set會自動去重,因此死迴圈生成電話號碼,直到等於num個號碼停止
start = random.choice(['135', '136', '137']) # 存放前3位的號段,從中隨機取一個
end = ''.join(random.sample(string.digits, 8)) # 隨機生成後面8位數字
all_phone_nums.add(f'{start}{end}') # 拼接前3位和後8位
if len(all_phone_nums) >= num: # 如果號碼個數等於num,則停止
break
phone_num(10000 * 10000)
經過這次寫程式碼我才發現,原來Python的random裡有那麼多好用的生成隨機數的方法。
我把它們全部整理出來了,今天我們就來一起學習一下~
如有遺漏或者錯誤,歡迎大家多多指點~
隨機數是哪個檔案生成的?
在上面的程式碼第一行:import random
,我們匯入了random這個標準庫。
這個庫只有一個檔案:random.py
,這個檔案的結構主要分為3個
部分(如下圖所示),它們的作用分別是:
- 2個主要的類:
Random(_random.Random)
和SystemRandom(Random)
- 其中我們使用最多的是
Random()
- 其中我們使用最多的是
- 有2個測試方法:
_test_generator(n, func, args)
和_test(N=2000)
- 這一部分我們用不到
- 我們呼叫的函式:使用方法如上面程式碼的
random.choice
、random.sample
,具體使用方法,我們接下來會詳細解釋。
random提供了哪些隨機數方法?
接下來我們重點講解作為python的使用者,我們會使用到哪些random
的隨機數方法,也就是上文提到的random.py
檔案裡的第3部分。
如下圖的程式碼所示,random提供的方法有22個,主要分為2類:
普通使用者
常用的方法,一共有12個
;科學計算
常用的方法,一共有10個
。
普通使用者的12個隨機數方法怎麼用?
對於上面這22個隨機數方法,我在這裡重點介紹一下普通使用者常用的那12個方法。
至於後面這個10個用於科學計算的方法,因為實在是高深,我就不在這裡浪費時間了,有興趣的同學,可以直接去翻一下數學書:《概率論》。
1. random.seed & random.getstate & random.setstate
把這3個放到一起說,是因為random本質上生成的是偽隨機數,而這3個函式,很好的體現了偽隨機數這個特性
程式碼示例:seed
# 指定seed後,生成的隨機數一樣
random.seed(1)
print('隨機數1:', random.random())
random.seed(1)
print('隨機數2:', random.random())
# output:
# 隨機數1: 0.13436424411240122
# 隨機數2: 0.13436424411240122
程式碼示例: random.getstate & random.setstate
import random
random.seed(42)
print(random.sample(range(20), k=10))
st = random.getstate() # 取出生成上一行程式碼後,random的狀態
print(random.sample(range(20), k=20)) # print 20
random.setstate(st) # 恢復上一次的隨機狀態
print(random.sample(range(20), k=10)) # print same first 10
# output:
# [12, 0, 4, 3, 11, 10, 19, 1, 5, 18]
# [4, 9, 0, 3, 10, 8, 16, 7, 18, 17, 14, 6, 2, 1, 5, 11, 15, 13, 19, 12]
# [4, 9, 0, 3, 10, 8, 16, 7, 18, 17]
2. random.random
隨機生成一個[0,1)之間的浮點數
程式碼示例
float = random.random()
"""
float = 0.123565654548978
"""
3. random.uniform
產生[a,b]範圍內一個隨機浮點數
程式碼示例
float = random.uniform(11,15)
"""
float = 13.882923467738049
"""
4. random.randint
隨機生成[a,b]範圍內一個整數。
程式碼示例
int = random.randint(1, 9)
"""
int = 2
"""
5. random.choice
從非空序列中隨機選取一個數據並帶回,該序列可以是list、tuple、str、set。
程式碼示例
str = random.choice("程式設計師晚楓原創系列")
"""
str = 原
"""
6. random.choices
Python3.6版本新增。從叢集中隨機選取k次資料,返回一個列表,可以設定權重。一共有4個引數
- population:叢集,必填。
- weights:相對權重。
- cum_weights:累加權重,不常用。不能和weights共用。
- k:選取次數。
程式碼示例
str = ["程", "序", "員", "晚", "楓"]
res = random.choices(str, weights=[0, 0, 1, 0, 0], k=5)
"""
因為給【員】這個字,通過weights引數增加了特別的權重:1,而其他的權重都是0,所以不論隨機選多少次,結果都是【員】
res = ['員', '員', '員', '員', '員']
"""
7. random.randrange(a,b,step)
參考range的用法:
- 不指定step,隨機生成[a,b)範圍內一個整數。
- 指定step,step作為步長會進一步限制[a,b)的範圍,比如randrange(0,11,2)意即生成[0,11)範圍內的隨機偶數。
- 不指定a,則預設從0開始。
程式碼示例
int = random.randrange(3, 9)
"""
int = 5
"""
8. random.sample
從集合中選取k個元素,返回一個列表,叢集可以是list、tuple、str、set。
- 不會重複:可以理解為發一副撲克牌,確實是隨機發,但是不會重複。
- 隨機次數,不能超過集合的長度。發牌的時候,一副牌有54張,不可能隨機抽取100次。
程式碼示例
str = ["程", "序", "員", "晚", "楓"]
res = random.sample(str, 5)
"""
res = ['員', '序', '程', '楓', '晚']
"""
9. random.shuffle
打亂原來有順序的集合,注意:這個方法沒有返回值,它直接改變的是原集合的順序。所以如果你想改變tuple這種不可變的集合,會報錯。
程式碼示例
str = ["程", "序", "員", "晚", "楓", "有", "順", "序"]
random.shuffle(str)
"""
str = ['楓', '順', '員', '序', '有', '晚', '序', '程']
"""
10. random.getrandbits
生成指定位數大小的整數。
程式碼示例
int = random.getrandbits(8)
"""
int = 136
"""
寫在最後
雖然自己是Python程式設計師,但是最近開發中卻發現很多基礎知識自己沒掌握。
於是決定從這一篇開始,我決定帶著當時加入Python時,餵馬劈柴面朝大海的浪漫情懷,去認真的深入整理分享Python常用的知識點。
希望對你有用。
- 幫師姐把100個Excel中符合條件的資料,彙總到1個Excel裡
- 176萬!GPT-4釋出了,如何檢視OpenAI的下載量?
- 1行Python程式碼,把PPT轉成圖片,python-office功能更新~
- 定了!Python3.7,今年停止更新!
- 1行Python程式碼去除圖片水印,網友:乾乾淨淨!
- Python辦公實戰!按姓名拆分Excel為單獨檔案,微信自動發給相應聯絡人
- 12個Python自動化辦公的官方文件,中文版只有2個?
- 終究還是錯付了!這2種Python寫法已經被淘汰了,你是不是還在用?
- 用Python下載B站視訊?1行命令搞定,悄悄用
- 用Python自動生成 圖文並茂的資料分析 報告
- 自動合併Excel的4種方法,pandas自動化辦公,YYDS
- 絕了!深度解析了1道華為Python筆試題,竟然可以學會12種Python里正則表示式的用法
- 1行Python程式碼,實現PDF轉圖片,速度太太太太太快了
- 1行Python程式碼,拿到周杰倫新歌的MP3檔案,終於可以免費聽周杰倫了
- 官方推薦:6種Pandas讀取Excel的方法,太方便了~
- 如何生成1億個手機號碼?Python生成隨機數的22種方法,random函式太強了~
- 新人必看:python自動化辦公,開源專案的目錄結構
- 一行Python程式碼,給PDF檔案新增水印
- 太厲害了,通過文件內容快速查詢檔案,1行Python程式碼實現
- 一行Python程式碼,如何成為辦公小助手?這5個操作,超實用!