少說話多寫程式碼之Python學習062——標準模組(random模組)
阿新 • • 發佈:2018-12-17
random主要是產生隨機數。不過實際上,不論哪種語言中所謂的隨機數,其實都不是真正意義的隨機數。random中的SystemRandom可以讓資料接近真正的隨機數。
我們通過下面的例子來看看隨機數的使用。
我們在一段時間內產生隨機時間。
from random import * from time import * #隨機時間 date1 = (2018,1,1,0,0,0,-1,-1,-1) time1 = mktime(date1) date2 = (2019,1,1,0,0,0,-1,-1,-1) time2 = mktime(date2) randomtime = uniform(time1,time2) print(randomtime) print(asctime(localtime(randomtime))) 輸出 1515458794.747572 Tue Jan 9 08:46:34 2018
這裡表示在2018年1月1日到2019年1月1日均勻產生隨機日期。
下面我們再看一個擲骰子的遊戲,
#擲骰子
from random import randrange
inputnum = input('幾個骰子?')
inputsides = input('每個骰子的面數?')
sum=0
num = int(inputnum)
sides = int(inputsides)
for i in range(num): sum += randrange(sides)+1
print('結果是',sum)
輸出
幾個骰子?3
每個骰子的邊數?6
結果是 5
再來看看讀取檔案,比如我們有一篇《正氣歌》,隨機讀取一句出來。
我們將正氣歌,按照每句一行的方式存在一個txt檔案中:fortuneTest.txt。欣賞下正氣歌正文:
天地有正氣,雜然賦流形。 下則為河嶽,上則為日星。 於人曰浩然,沛乎塞蒼冥。 皇路當清夷,含和吐明庭。 時窮節乃見,一一垂丹青。 在齊太史簡,在晉董狐筆。 在秦張良椎,在漢蘇武節。 為嚴將軍頭,為嵇侍中血。 為張睢陽齒,為顏常山舌。 或為遼東帽,清操厲冰雪。 或為出師表,鬼神泣壯烈。 或為渡江楫,慷慨吞胡羯。 或為擊賊笏,逆豎頭破裂。 是氣所磅礴,凜烈萬古存。 當其貫日月,生死安足論。 地維賴以立,天柱賴以尊。 三綱實繫命,道義為之根。 嗟予遘陽九,隸也實不力。 楚囚纓其冠,傳車送窮北。 鼎鑊甘如飴,求之不可得。 陰房闐鬼火,春院閟天黑。 牛驥同一皁,雞棲鳳凰食。 一朝濛霧露,分作溝中瘠。 如此再寒暑,百沴自辟易。 嗟哉沮洳場,為我安樂國。 豈有他繆巧,陰陽不能賊。 顧此耿耿在,仰視浮雲白。 悠悠我心悲,蒼天曷有極。 哲人日已遠,典刑在夙昔。 風檐展書讀,古道照顏色。
#隨機讀取檔案
# 用命令執行
#程式碼見fortune.py
#命令列執行見文章描述
讀取檔案的程式碼如下,在fortune.py中,
import fileinput,random
#中文內容會報異常
#fortunes=list(fileinput.input())
fortunes=list(fileinput.input(openhook=fileinput.hook_encoded('utf-8')))
print(random.choice(fortunes))
這裡需要注意,因為我們的txt檔案內容是中文,如果使用fileinput.input()讀取,會報:
UnicodeDecodeError: 'gbk' codec can't decode byte...
這個異常,為了防止這個異常,我們需要按照上文增加指定編碼格式讀取。執行過程和結果如下,
最後我們再看一個發牌的例子,我們希望每次發的牌不相同。
#發牌
values = list(range(1,11)) + 'J Q K'.split()
suits = '方塊 梅花 紅心 黑桃'.split()
deck=['%s %s' % (s,v) for v in values for s in suits]
from pprint import pprint
pprint(deck[:12])
輸出
['方塊 1',
'梅花 1',
'紅心 1',
'黑桃 1',
'方塊 2',
'梅花 2',
'紅心 2',
'黑桃 2',
'方塊 3',
'梅花 3',
'紅心 3',
'黑桃 3']
這樣的牌隨機性還不太好,我們需要優化下。
print('優化後的翻牌:')
from random import shuffle
shuffle(deck)
pprint(deck[:12])
輸出
優化後的翻牌:
['方塊 9',
'方塊 Q',
'方塊 3',
'黑桃 4',
'梅花 2',
'方塊 6',
'梅花 10',
'梅花 7',
'黑桃 2',
'黑桃 J',
'方塊 4',
'黑桃 Q']
上面只打印了12張牌,我們打印出整副牌。
print('一副牌:')
pprint(deck[:54])
輸出
一副牌:
['梅花 1',
'黑桃 5',
'梅花 3',
'黑桃 10',
'梅花 Q',
'梅花 10',
'方塊 2',
'紅心 8',
'黑桃 K',
'梅花 8',
'梅花 5',
'紅心 10',
'方塊 K',
'紅心 5',
'黑桃 7',
'紅心 9',
'黑桃 3',
'紅心 K',
'紅心 2',
'梅花 J',
'紅心 J',
'黑桃 J',
'方塊 10',
'黑桃 2',
'紅心 7',
'方塊 J',
'黑桃 6',
'紅心 3',
'方塊 7',
'梅花 7',
'方塊 3',
'紅心 6',
'梅花 6',
'黑桃 9',
'方塊 Q',
'黑桃 4',
'方塊 9',
'方塊 1',
'紅心 Q',
'方塊 6',
'黑桃 8',
'黑桃 Q',
'方塊 4',
'紅心 4',
'紅心 1',
'梅花 K',
'黑桃 1',
'方塊 8',
'梅花 4',
'梅花 2',
'方塊 5',
'梅花 9']
工程檔案下載:https://download.csdn.net/download/yysyangyangyangshan/10854666