如何生成1億個手機號碼?Python生成隨機數的22種方法

如何生成1億個手機號碼?Python生成隨機數的22種方法

大家好,這裡是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

,具體使用方法,我們接下來會詳細解釋。

如何生成1億個手機號碼?Python生成隨機數的22種方法

random提供了哪些隨機數方法?

接下來我們重點講解作為python的使用者,我們會使用到哪些

random

的隨機數方法,也就是上文提到的

random。py

檔案裡的第3部分。

如下圖的程式碼所示,random提供的方法有22個,主要分為2類:

普通使用者

常用的方法,一共有

12個

科學計算

常用的方法,一共有

10個

如何生成1億個手機號碼?Python生成隨機數的22種方法

def-water

普通使用者的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常用的知識點。

希望對你有用。

想了解更多精彩內容,快來關注程式設計師晚楓

1行Python程式碼,合併100個Excel檔案,竟然這麼方便?!

某寶動漫頭像一張50元?1行Python程式碼實現,別再去交智商稅了

新人必看:python自動化辦公,開源專案的目錄結構