1. 程式人生 > >少說話多寫程式碼之Python學習062——標準模組(random模組)

少說話多寫程式碼之Python學習062——標準模組(random模組)

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