视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python知识分解析掷骰子游戏
2020-11-27 14:12:57 责编:小采
文档

1、猜次数

1-6中每个数字出现的次数
# 导入包
import pygal
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
from random import randint
# 利用随机数据模拟掷骰子
# 每次显示1-6中的一个数

num_sides = 6 # 骰子的6个面
def getData(N, times):
 """
 定义函数,获取投掷数据
 N: 表示一次用几个骰子投
 times:表示总共投几次
 """ 
 results = [] 
 for n in range(1,N+1): 
 for roll_num in range(times):
 result = randint(1,num_sides)
 results.append(result) 
 return results
# 打印投掷结果
print(getData(1,10)) # 1个骰子掷10次
print(getData(2,5)) # 2个骰子掷5次
[2, 2, 2, 2, 1, 6, 4, 4, 5, 5]
[4, 3, 5, 6, 2, 2, 3, 6, 4, 4]
# 分析结果# 统计每个数字出现的次数并显示图片
 # N: 表示一次用几个骰子投
 # data 表示投掷数据def showResult(N, times):
 frequencies = [] for value in range(1, num_sides+1):
 frequency = getData(N, times).count(value)
 frequencies.append(frequency) # 数据可视化
 # 本次利用 pygal 生成SVG格式矢量图
 hist = pygal.Bar()
 hist.title = str(N)+"个骰子掷"+ str(times) +"次的结果"
 hist.x_labels = ['1','2','3','4','5','6']
 hist.x_title = "点数"
 hist.y_title = "出现次数"

 hist.add(str(N)+'骰子', frequencies)
 hist.render_to_file('1-'+str(N)+str(times)+'.svg') # 储存为矢量图
# 一个骰子掷10,100, 1000, 10000次结果分析showResult(1,10)
showResult(1,100)
showResult(1,1000)
showResult(1,10000)

# 2个骰子掷10,100, 1000, 10000次结果分析showResult(2,10)
showResult(2,100)
showResult(2,1000)
showResult(2,10000)

3个骰子、4个骰子就不再截图了。

我们发现在投掷的次数越多,每个数出现的概率越接近,最后趋向于相同。

2、猜大小

每次投掷点数和
# 每次投掷点数和def getData2(N, times):
 """
 定义函数,获取投掷数据
 N: 表示一次用几个骰子投
 times:表示总共投几次
 """ 
 results = [] for roll_num in range(times):
 result = 0
 for n in range(1,N+1):
 result += randint(1,num_sides)
 results.append(result) 
 return results
# 打印投掷结果print(getData2(1,10)) # 1个骰子掷10次print(getData2(2,5)) # 2个骰子掷5次
[4, 3, 6, 2, 5, 4, 5, 3, 6, 2]
[6, 10, 5, 8, 7]
# 分析结果# 统计数字和出现的次数并显示图片
 # N: 表示一次用几个骰子投
 # data 表示投掷数据def showResult2(N, times):
 frequencies = [] for value in range(N, N*num_sides+1):
 frequency = getData2(N, times).count(value)
 frequencies.append(frequency) # 数据可视化
 # 本次利用 matplotlib 生成图片
 x_num = N*num_sides+1-N
 idx = np.arange(x_num)
 width = 0.5
 sn = str(N)
 sm = str(times)
 x_labels = [str(n) for n in range(N, N*num_sides+1)] # X轴刻度

 plt.bar(idx, frequencies, width, color='red', label=sn+'个骰子')
 plt.xlabel('点数和')
 plt.ylabel('出现次数')
 plt.title(sn+'个骰子投掷'+ sm +'次的结果')
 plt.xticks(idx, x_labels)
 plt.legend() # 显示图例
 plt.show()

1颗骰子猜大小没多大意义,我们直接来分析两骰子的情况。

# 2个骰子掷10,100, 1000, 10000次结果分析showResult2(2,10)
showResult2(2,100)
showResult2(2,1000)
showResult2(2,10000)

# 3个骰子掷10,100, 1000, 10000次结果分析showResult2(3,10)
showResult2(3,100)
showResult2(3,1000)
showResult2(3,10000)

# 4个骰子掷10,100, 1000, 10000次结果分析showResult2(4,10)
showResult2(4,100)
showResult2(4,1000)
showResult2(4,10000)

从上面几图中我们可以看到,当投掷次数足够多时,出现大/小点数出现的概率基本相同,点数大小呈现正态分布的特点。

相关推荐:

练手小程序:craps掷骰子游戏

掷骰子问题

下载本文
显示全文
专题