程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

如何生成1億個手機號碼?Python生成隨機數的22種方法,random函數太強了~

編輯:Python

大家好,這裡是Python程序員晚楓。

案例解析

最近在網上看到一個python的面試題目:如何用Python生成1億個手機號碼?

我第一眼看到的時候心想,這個還不簡單?直接random.randint(1,999999999999)就完事了。

但是馬上就發現了這其中的錯誤:這個是生成1-99999999之間的隨機數,可能是1,也可能是666.

但電話號碼是11位的,而且前3位只有指定的號段,比如135、136。直接random.randint(1,999999999999)這麼做並不符合條件。

那麼如何生成呢?於是有了下面這段代碼:

import randomdef 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,則停止 breakphone_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.choicerandom.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 randomrandom.seed(42)print(random.sample(range(20), k=10))st = random.getstate() # 取出生成上一行代碼後,random的狀態 print(random.sample(range(20), k=20)) # print 20random.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. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved