[python] random 模塊 -- 生成隨機(jī)數(shù)/打亂序列

random 模塊是 python 自帶模塊中非常常用的一個(gè)模塊,它可以產(chǎn)生許多隨機(jī)化的操作棒厘。無論你是做網(wǎng)頁開發(fā),還是寫普通的算法程序下隧,隨機(jī)數(shù)的生成都起到了很重要的作用奢人。

隨機(jī)數(shù)種子 seed() 與 random() 函數(shù)

按照其他語言的慣例,在導(dǎo)入 random 模塊之后淆院,我們首先需要設(shè)定一個(gè)隨機(jī)數(shù)種子 seed(num) 何乎。其中 num 就是要設(shè)置的種子。為什么要設(shè)置隨機(jī)數(shù)種子呢土辩?其實(shí)計(jì)算機(jī)的隨機(jī)數(shù)是一種“偽隨機(jī)數(shù)”支救,它并不能做到真正的隨機(jī),而是用一種算法通過隨機(jī)數(shù)種子計(jì)算出一個(gè)“隨機(jī)的”序列拷淘。所以當(dāng)隨機(jī)數(shù)種子相同的時(shí)候各墨,出現(xiàn)的隨機(jī)數(shù)的序列是一樣的。在設(shè)定了隨機(jī)數(shù)種子后启涯,我們就可以用 random() 函數(shù)來輸出隨機(jī)數(shù)贬堵。下面我們先演示隨機(jī)數(shù)種子相同的情況:

import random
random.seed(3)
print(random.random())

運(yùn)行兩次,輸出結(jié)果是相同的

0.23796462709189137

0.23796462709189137

前面說其他語言使用 random() 前要定義隨機(jī)數(shù)種子逝嚎,但是 python 與其他語言不同扁瓢。當(dāng)你省去 seed() 中的參數(shù)時(shí),它會(huì)自動(dòng)使用系統(tǒng)當(dāng)前時(shí)間作為種子补君,因?yàn)闀r(shí)間基本不會(huì)重復(fù)引几,所以就可以保證隨機(jī)的唯一性(不會(huì)像指定種子那樣會(huì)重復(fù))。 python 中使用 random 模塊時(shí),還可以不加 seed() 這一語句伟桅,它也會(huì)自動(dòng)將當(dāng)前時(shí)間設(shè)置為隨機(jī)數(shù)種子敞掘。所以我們測(cè)試下面的代碼:

import random
print(random.random())

可以看到,這樣的話兩次輸出就不同了楣铁,表面上看起來就具備了隨機(jī)性玖雁。

0.826457253856883

0.656398726587975

randint() / randrange() / uniform() / getgetrandbits()

細(xì)心的朋友可能會(huì)發(fā)現(xiàn), random() 輸出的值都在0-1之間盖腕,事實(shí)上它的取值范圍是 [0, 1) 的浮點(diǎn)數(shù)赫冬,那么假如想要輸出 [1,9] 的整數(shù),要怎么辦呢溃列?

也許有的人會(huì)想到:

int(random.random() * 9) + 1

如果你想到了上面的代碼劲厌,恭喜你,基礎(chǔ)功不錯(cuò)听隐。不過在 python 中补鼻,這就不夠“簡潔優(yōu)雅”了。正確的使用方法是

random.randint(1, 9)

randint(a, b) 的作用是產(chǎn)生一個(gè) [a, b] 的整數(shù)雅任。與這個(gè)不同的是风范, randrange(m, n[, k = 1]) 這個(gè)函數(shù)可以產(chǎn)生一個(gè) [m, n) 之間以 k 為步長的整數(shù),其中參數(shù) k 是可以省略的沪么,默認(rèn)值為1硼婿。使用上面幾個(gè)函數(shù)時(shí),要注意開閉區(qū)間成玫。

randint(a, b)randrange(m, n[, k = 1]) 這兩個(gè)函數(shù)產(chǎn)生的都是整數(shù)加酵。如果要隨機(jī)產(chǎn)生一段區(qū)間的浮點(diǎn)數(shù)的話,就可以用uniform(a, b)這一個(gè)函數(shù)哭当,它可以生成一個(gè)區(qū)間為 [a, b] 的隨機(jī)小數(shù)猪腕。除此之外,還有一個(gè) getrandbits(k) 的函數(shù)钦勘,它可以產(chǎn)生k比特長的隨機(jī)整數(shù)陋葡,在使用固定位數(shù)16進(jìn)制數(shù)或者2進(jìn)制數(shù)時(shí),這個(gè)函數(shù)將更加好用彻采。

上面講了這么多都是和生成隨機(jī)數(shù)有關(guān)腐缤,不過 random 模塊不僅僅能產(chǎn)生隨機(jī)數(shù),它還能實(shí)現(xiàn)更多的功能……

choice() 與 choices() - 隨機(jī)選擇

比如說你想做一個(gè)隨機(jī)點(diǎn)名的程序肛响,你將所有學(xué)生的姓名放在一個(gè)列表中岭粤。假如 random 模塊只能實(shí)現(xiàn)生成隨機(jī)數(shù)的功能的話,你還必須要將產(chǎn)生的隨機(jī)數(shù)一一分配(比如說分配學(xué)號(hào))特笋,這樣并不直觀剃浇。這個(gè)時(shí)候, python 就給我們提供了一個(gè)很好的選擇 -- choice(seq) 。這個(gè)函數(shù)可以實(shí)現(xiàn)從一個(gè)列表中隨機(jī)選擇一個(gè)內(nèi)容并返回虎囚。例如以下的代碼:

import random
ls = ['David', 'Mike', 'Jack']
print(random.choice(ls))
David

如果要選出多個(gè)元素的話角塑,只需要在 choice 后面加個(gè) s ,choices(seq[, k = 1]) 淘讥,其中seq仍為待輸入的序列圃伶,在后加 k = n 則可以挑選出 n 個(gè)元素生成一個(gè)新的列表。不過這個(gè)元素是會(huì)重復(fù)的蒲列。下面就遇到了這個(gè)問題:

import random
ls = ['David', 'Mike', 'Jack']
print(random.choices(ls,k = 2))
['Jack', 'Jack']

shuffle() - 隨機(jī)打亂一個(gè)序列

接下來就是一個(gè)更有趣的函數(shù)了窒朋, shuffle(seq) ,它可以將一個(gè)序列打亂蝗岖。注意它會(huì)將數(shù)列原地打亂炼邀,意思就是說,運(yùn)行完畢后 seq 保存的就是打亂后的序列剪侮,而將這個(gè)函數(shù)的結(jié)果直接輸出或者賦值給其他變量都是不可行的。

錯(cuò)誤 用法:

import random
ls = ['David', 'Mike', 'Jack']
print(random.shuffle(ls))
返回值是 None 洛退,所以正確用法為

import random
ls = ['David', 'Mike', 'Jack']
random.shuffle(ls)
print(ls)
返回值是 ['Mike', 'Jack', 'David']
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓣俯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子兵怯,更是在濱河造成了極大的恐慌彩匕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媒区,死亡現(xiàn)場(chǎng)離奇詭異驼仪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)袜漩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門绪爸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宙攻,你說我怎么就攤上這事奠货。” “怎么了座掘?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵递惋,是天一觀的道長。 經(jīng)常有香客問我溢陪,道長萍虽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任形真,我火速辦了婚禮杉编,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己王财,他們只是感情好卵迂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绒净,像睡著了一般见咒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挂疆,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天改览,我揣著相機(jī)與錄音,去河邊找鬼缤言。 笑死宝当,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胆萧。 我是一名探鬼主播庆揩,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼跌穗!你這毒婦竟也來了订晌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蚌吸,失蹤者是張志新(化名)和其女友劉穎锈拨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羹唠,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奕枢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佩微。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缝彬。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖喊衫,靈堂內(nèi)的尸體忽然破棺而出跌造,到底是詐尸還是另有隱情,我是刑警寧澤族购,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布壳贪,位于F島的核電站,受9級(jí)特大地震影響寝杖,放射性物質(zhì)發(fā)生泄漏违施。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一瑟幕、第九天 我趴在偏房一處隱蔽的房頂上張望磕蒲。 院中可真熱鬧留潦,春花似錦、人聲如沸辣往。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽站削。三九已至坊萝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間许起,已是汗流浹背十偶。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留园细,地道東北人惦积。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像猛频,于是被迫代替她去往敵國和親狮崩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 我們可以先來了解下偽隨機(jī)數(shù)和真隨機(jī)數(shù)的概念鹿寻。 偽隨機(jī)數(shù):偽隨機(jī)數(shù)是用確定性的算法計(jì)算出來自[0,1]均勻分布的隨機(jī)...
    a479a910abe7閱讀 2,485評(píng)論 0 0
  • DE讀伴第7期 第1天 微名:快樂之家~快樂的孩子 【打卡20190112】 【書名】親愛的漢修先生(貝芙莉?克...
    張若愚三角龍閱讀 291評(píng)論 0 0
  • 17/02/2017 還記得無壓工作中創(chuàng)建自己的工作籃嗎烈和?你有具體行動(dòng)實(shí)施了嗎?是不是覺得自己的工作和生活已經(jīng)開始...
    氫哈哈閱讀 910評(píng)論 3 0