擲色子的問題總會出現在概率課本中,老師們都喜歡拿這個耳熟能詳的事件來舉例子,但今天我們不講概率,我們來用Python模擬擲色子。
用random模塊我們可以輕易地模擬輸出點數(一般我們取的這個點數是色子頂上的點數),即隨機生成一個1-6的數字。
random.randint(1,6)
的確非常容易,但如果我們想要知道色子的正面反面,左面右面的數值,又該如何計算呢?
本着求知探索精神, 我翻箱倒櫃找到一枚祖傳色子,來仔細觀察一下。
我們可以發現,每個點數的對面點數相加都爲7,即1的對面點數爲6,剩下的2,3,4,5也對稱的分佈在1的四側(2,5相對,3,4相對)。但是其四面的順序,從不同的角度觀測其排列順序方式也是不同的,還是以頂上點數1爲例,從點數2開始按照順時針我們可以看到2,4,5,3,從點數4開始按照順時針我們可以看到4,5,3,2,而這些序列構成一個環狀。而這些環狀數組,我們可以直接用列表來表示,1-6點的順時針側面點數列表如下所示
[2,4,5,3]
[1,3,6,4]
[1,5,6,2]
[1,2,6,5]
[1,4,6,3]
[2,3,5,4]
因此,想要描述一個色子的每一面就有了思路,首先隨機生成一個數字,直接當作頂部的數字;接着隨機生成一個狀態,表示從其對應數組的某一位開始,也可以直觀地理解爲從不同角度看過去;最後輸出不同位置的點數,用手繪立方體的方式打印出色子。
rand_number=random.randint(0,5)
rand_state=random.randint(0,3)
def throw():
print(" __ __ __ \n");
print(" / %d / |\n"%(rand_number+1))
print(" __ __ __ |\n")
print(" | | %d |\n"%dice[rand_number][(rand_state+1)%4])
print(" %d | %d | /\n"%(dice[rand_number][(rand_state+3)%4],dice[rand_number][(rand_state+2)%4]))
print(" __ __ __ /\n")
print(" %d\n"%(6-rand_number))
下面請欣賞我的靈魂畫作之畫色子~