python中dice常见问题_【python內建模組- random】教你模擬擲骰子

random模組可以幫助我們產生一個範圍內的隨機數字,

可說是程式設計遊戲的精華

給大家個動機,

遊戲內有許多隨機性元素,

舉凡擲骰子、擲硬幣,玩撲克牌洗牌都可以用到隨機數,

亦可以使用這個模組模擬多次丟骰子的過程

條列幾個常用的函數:

函數

說明

random.randrange(start, stop[, step])

隨機回傳一個 range(start, stop, step) 之中的數值

random.randint(a, b)

隨機回傳一個整數 N (a <= N <= b)

random.random()

隨機回傳一個浮點數 f (0 <= f <= 1)

random.uniform(a, b)

隨機回傳一個浮點數 f (a <= f <= b)

random.shuffle(seq)

隨機洗亂seq裡的順序

random.choice(seq)

隨機回傳seq裡的元素1個

random.choices(seq, k=1)

隨機回傳seq裡的元素k個(默認一個),可能重複

random.sample(seq, k)

隨機回傳seq裡的元素k個,不會重複

實際看例子學習如何使用吧

範例: 模擬丟一個骰子

random.randint(a, b)的效果是隨機回傳介於(a <= N <= b) 的整數 N,

因此要模擬一個可以丟出1~6點的六面骰可以這樣寫:

(註: dice是骰子的英文)

import random

def dice():

return random.randint(1,6)

你可以去試著呼叫這個函數,印出數字看看:

for i in range(10):

print(dice())

應該印出來的結果每次都不一樣

應用: 計算投兩個骰子總和等於7的機率

有了這個基礎概念後,

我們便可以用來計算一些數學課上可能非常困難計算的機率

(比如說用在隨機性有關的遊戲時計算勝率之類的xdd)

那怎麼算呢?

由於實際運用時,我們可能只在乎大概的機率,

並不一定很在乎準確值是多少,

因此可以直接跑程式模擬,

比如說我們做一萬次「實驗」,

假設成功了三千次,

那麼成功的機率就大概是3000/10000次

從簡單的問題開始,請問同時投擲兩個公平的六面骰,

兩個骰子總和等於7的機率大約是多少?(取到小數點後第二位即可)

如果你高中數學還行的話,

可以很容易算出來機率是6/36 = 0.166…

用程式模擬看看數字準不準確吧

範例程式

import random

def dice():

return random.randint(1,6)

def ex():

X=dice()

Y=dice()

return X+Y==7

def simulate(experiment, times):

success=0

for i in range(times):

if experiment():

success+=1

return success/times

#估計兩個骰子總和為7的機率

print(simulate(ex,100)) #模擬丟兩個骰子100次

print(simulate(ex,1000)) #模擬丟兩個骰子1000次

print(simulate(ex,10000)) #模擬丟兩個骰子10000次

print(simulate(ex,100000)) #模擬丟兩個骰子100000次

對了,記得python的特性是可以把函數當做參數傳進另一個函數裡的,

這邊我們定義兩個函數,simulate()和ex()

ex()指的是一次「實驗」(比如說丟兩個骰子),

若等於7回傳True(表示成功),

其它狀況回傳失敗

simulate()指的是模擬多次「實驗」,

參數experiment是一個函數,

參數times表示進行實驗的次數,

跑for迴圈,每當實驗成功就將變數success加一,

最後回傳成功率

看一下小馬程式執行的結果(注意因為有隨機性,結果不是固定的數字):

丟骰子100次時,總和為7的比率: 0.15

丟骰子1000次時,總和為7的比率: 0.162

丟骰子10000次時,總和為7的比率: 0.1716

丟骰子100000次時,總和為7的比率: 0.16589

真實機率是0.166…,夠準吧?

原則上,模擬次數愈高,愈容易接近真實機率

示範就玩到這邊吧,

相信聰明如你應該可以探索出random模組更多的用途

課後練習: 骰子大比拼,輸的請午餐

瑪麗邀請你跟她玩一個骰子遊戲,

擲出點數大的人獲勝,

輸的人要請贏的人吃午餐

有兩組骰子可供選擇:

第一組 : 同時丟兩個公平的六面骰

第二組 : 丟一個公平的十二面骰(即出現1~12的機率是相同的)

瑪麗讓你先選,她挑剩下的那一組,

但是瑪麗說,因為丟兩個六面骰出現的點數是2~12,

天生比十二面骰只有1~12的點數占優勢,

因此規定若點數平手的話,那麼用十二面骰的人獲勝

你心想,瑪麗特別規定點數平手十二面骰會贏,

表示六面骰必定有詐,因此決定選十二面骰

關於勝負判定,舉幾個例子說明:

你用十二面骰擲出6,瑪麗用兩個六面骰擲出2和3,你贏了

你用十二面骰擲出6,瑪麗用兩個六面骰擲出3和4,瑪麗贏了

你用十二面骰擲出6,瑪麗用兩個六面骰擲出2和4,平手視為瑪麗贏

那麼,請問瑪麗需要請你吃午餐的機率最接近哪個數?

(a) 40%

(b) 45%

(c) 50%

(d) 55%

(e) 60%

你可以用任何方法算,

不過其實拿範例程式小改一下應該就出來了

參考答案

參考程式碼:

import random

def dice(n):

return random.randint(1,n)

def ex():

X = dice(6) + dice(6)

Y = dice(12)

return X>Y

def simulate(experiment, times):

success=0

for i in range(times):

if experiment():

success+=1

return success/times

print(simulate(ex,10000))

其實本題機率在數學上的值正好就是50%,

不論你選哪組骰子,你和瑪麗都是各自一半機率獲勝,

這個遊戲是公平的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值