掷色子的问题总会出现在概率课本中,老师们都喜欢拿这个耳熟能详的事件来举例子,但今天我们不讲概率,我们来用Python模拟掷色子。

 

用random模块我们可以轻易地模拟输出点数(一般我们取的这个点数是色子顶上的点数),即随机生成一个1-6的数字。

random.randint(1,6)

的确非常容易,但如果我们想要知道色子的正面反面,左面右面的数值,又该如何计算呢?

本着求知探索精神, 我翻箱倒柜找到一枚祖传色子,来仔细观察一下。

用Python来掷个色子~_掷色子

我们可以发现,每个点数的对面点数相加都为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))

 

下面请欣赏我的灵魂画作之画色子~

用Python来掷个色子~_掷色子_02

 

 

——END——