Python-投骰子(random,plotly)

说明:

(1) 使用random中的randint产生指定数量的随机整数(骰子点数)

(2) 通过plotly.graph_objs中的Bar和Layout,plotly中的Offline可视化结果

1 骰子类代码

实列化骰子,定义骰子的行为(方法)。

from random import randint

class Die:
    '''建立一个骰子的类'''
    def __init__(self,num_sides=6):
        '''默认骰子为6面'''
        self.num_sides=num_sides
    def roll(self):
        '''返回一个位于1和骰子面之间的随机整数'''
        return randint(1,self.num_sides)

2 投掷一次骰子并可视化

代码:

print("骰子投出的情况:")
#创建骰子对象
die=Die()
results=[]
for roll_num in range(1000):
    result=die.roll()
    results.append(result)
print(results)

print("每一面出现的频率:")
'''计算每一面出现的频率'''
frequencies=[]
for value in range(1,die.num_sides+1):
    #计算value在结果中的频率
    frequency=results.count(value)
    frequencies.append(frequency)
print(frequencies)

'''可视化输出,柱状图显示出现的频率'''
from plotly.graph_objs import Bar,Layout
from plotly import offline
# 对结果进行可视化。
x_values = list(range(1, die.num_sides + 1))
data = [Bar(x=x_values, y=frequencies)]
x_axis_config = {'title': '结果'}#x坐标label
y_axis_config = {'title': '结果的频率'}#y坐标label
#设置图标的title
my_layout = Layout(title='掷一个 D6 1000 次的结果',xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d6.html')

输出结果

骰子投出的情况:
[2, 5, 1, 5, 6, 5, 6, 5, 6, 3, 5, 2, 6, 6, 3, 1, 4, 6, 3, 2, 5, 6, 3, 2, 6, 3, 5, 4, 3, 3, 6, 6, 2, 1, 1, 6, 1, 2, 3, 4, 2, 1, 2, 5, 4, 4, 1, 6, 1, 2, 2, 1, 3, 3, 6, 3, 6, 4, 5, 5, 6, 6, 2, 1, 5, 4, 2, 4, 6, 1, 6, 6, 3, 5, 1, 1, 2, 4, 5, 4, 1, 2, 4, 4, 2, 4, 4, 4, 4, 1, 2, 1, 5, 5, 1, 6, 6, 4, 2, 2, 2, 2, 5, 3, 1, 6, 3, 5, 6, 5, 1, 1, 5, 3, 3, 6, 4, 1, 6, 3, 1, 6, 1, 1, 6, 6, 5, 3, 5, 4, 6, 5, 4, 5, 1, 1, 4, 4, 4, 3, 1, 5, 3, 6, 6, 2, 4, 5, 6, 6, 4, 5, 5, 1, 4, 2, 5, 1, 3, 5, 6, 2, 5, 5, 5, 2, 5, 5, 2, 6, 1, 5, 6, 2, 6, 4, 4, 5, 5, 2, 3, 5, 2, 4, 4, 4, 5, 2, 6, 4, 4, 4, 3, 2, 4, 1, 6, 1, 6, 6, 4, 4, 5, 2, 2, 5, 1, 4, 5, 1, 4, 6, 1, 6, 1, 1, 5, 3, 2, 5, 3, 4, 2, 3, 6, 3, 1, 3, 5, 6, 2, 3, 2, 2, 6, 1, 5, 6, 4, 1, 6, 6, 5, 3, 2, 1, 1, 1, 1, 5, 2, 5, 1, 5, 1, 6, 4, 5, 3, 6, 5, 4, 2, 5, 4, 6, 5, 1, 5, 6, 3, 3, 5, 1, 4, 5, 1, 1, 2, 5, 6, 6, 1, 2, 1, 6, 6, 5, 3, 2, 4, 5, 6, 5, 3, 4, 1, 2, 4, 2, 4, 6, 3, 6, 1, 5, 2, 5, 4, 6, 1, 2, 2, 2, 1, 2, 6, 6, 5, 4, 5, 4, 2, 5, 4, 3, 4, 1, 4, 1, 3, 1, 2, 5, 4, 2, 4, 4, 5, 3, 2, 5, 4, 5, 4, 3, 6, 3, 4, 5, 4, 5, 6, 6, 3, 1, 3, 3, 3, 3, 2, 3, 4, 4, 2, 6, 5, 2, 2, 1, 4, 4, 5, 6, 5, 1, 4, 5, 5, 4, 5, 4, 6, 2, 4, 5, 6, 4, 2, 2, 1, 3, 6, 5, 6, 3, 3, 3, 5, 1, 1, 6, 4, 3, 3, 6, 2, 4, 2, 3, 6, 1, 6, 2, 1, 5, 3, 6, 2, 6, 5, 5, 3, 4, 2, 4, 4, 5, 1, 2, 5, 6, 1, 3, 4, 3, 6, 6, 5, 4, 3, 6, 2, 6, 6, 3, 2, 4, 2, 4, 5, 2, 2, 2, 2, 4, 1, 1, 2, 5, 6, 5, 3, 3, 3, 1, 1, 6, 4, 2, 1, 1, 3, 5, 2, 5, 3, 5, 5, 6, 5, 5, 2, 3, 5, 4, 6, 3, 2, 1, 6, 4, 5, 3, 5, 1, 1, 1, 6, 6, 3, 6, 6, 3, 6, 5, 1, 4, 5, 1, 2, 1, 2, 1, 1, 4, 6, 2, 2, 2, 4, 4, 2, 2, 4, 1, 3, 6, 5, 1, 6, 4, 2, 6, 1, 5, 3, 2, 4, 6, 2, 4, 3, 4, 3, 4, 6, 5, 3, 6, 3, 2, 4, 3, 5, 5, 5, 6, 1, 4, 6, 1, 6, 4, 2, 5, 3, 5, 4, 6, 5, 5, 3, 4, 2, 5, 3, 3, 5, 6, 2, 1, 4, 5, 2, 3, 3, 2, 3, 5, 5, 6, 3, 4, 4, 3, 3, 5, 3, 2, 4, 4, 3, 3, 3, 1, 4, 6, 6, 6, 2, 1, 2, 6, 6, 4, 6, 4, 1, 1, 6, 3, 1, 5, 4, 6, 4, 3, 1, 6, 1, 4, 5, 4, 4, 5, 4, 5, 5, 6, 6, 1, 4, 2, 5, 3, 5, 2, 1, 6, 6, 6, 2, 1, 3, 3, 6, 3, 3, 4, 1, 4, 2, 2, 6, 4, 4, 4, 4, 1, 6, 3, 2, 1, 1, 2, 3, 6, 5, 6, 2, 3, 2, 2, 5, 5, 4, 4, 1, 2, 4, 3, 6, 4, 6, 2, 6, 2, 1, 3, 3, 1, 4, 2, 4, 6, 5, 6, 6, 5, 1, 1, 3, 2, 2, 4, 1, 4, 4, 5, 5, 3, 5, 1, 1, 3, 2, 2, 4, 5, 1, 4, 2, 3, 3, 6, 3, 2, 2, 6, 6, 3, 4, 5, 2, 5, 1, 4, 2, 4, 6, 3, 5, 1, 2, 4, 2, 1, 3, 5, 2, 3, 5, 5, 2, 5, 1, 1, 4, 3, 3, 6, 3, 4, 2, 1, 3, 1, 6, 1, 5, 1, 5, 5, 2, 5, 6, 1, 1, 3, 2, 5, 2, 4, 3, 5, 6, 2, 5, 3, 6, 1, 4, 6, 6, 1, 4, 5, 3, 4, 4, 2, 6, 2, 4, 5, 3, 2, 4, 5, 2, 4, 1, 6, 2, 2, 1, 4, 4, 6, 2, 3, 5, 2, 4, 2, 2, 5, 5, 5, 5, 2, 6, 3, 1, 5, 5, 5, 3, 6, 1, 6, 6, 5, 3, 3, 1, 6, 3, 4, 4, 5, 1, 2, 2, 2, 5, 1, 5, 4, 6, 6, 4, 5, 2, 5, 5, 4, 1, 1, 3, 4, 5, 6, 3, 2, 2, 2, 2, 4, 2, 3, 2, 4, 1, 6, 6, 3, 3, 5, 1, 3, 6, 1, 6, 6, 4, 4, 5, 1, 2, 6, 6, 5, 4, 3, 5, 1, 4, 2, 4, 1, 1, 5, 3, 6, 6, 5, 1, 4, 5, 6, 2, 3, 4, 3, 6, 1, 1, 2, 2, 4, 2, 1, 2, 5, 4, 1, 2, 1, 3, 1, 4, 1, 1, 2, 5, 1, 2, 1, 6, 4, 1, 1, 1, 1, 3, 4, 1, 1, 3, 3, 2, 2, 4, 4, 1, 2, 5, 3, 1, 2, 4, 6, 1, 5, 3, 3, 4, 5, 5, 6, 4, 2, 3, 3, 1, 3, 3, 3]
每一面出现的频率:
[163, 166, 151, 173, 179, 168]

3 同时投掷2枚骰子

代码:

'''投2个骰子'''
die1=Die()#实例化第一个骰子,6个点
die2=Die(8)#实例化第二个骰子,8个点
results_die=[]#投掷结果
frequencies_die=[]#出现的频率
for value in range(1000):
    result_die1=die1.roll()#存入第一个骰子的点数
    result_die2=die2.roll()#存入第二个骰子的点数
    results_die.append(result_die1+result_die2)#计算投掷的点数
print(f"两个骰子投掷的点数:\n{results_die}")

#计算点数出现的频率
max_result=die1.num_sides+die2.num_sides
for value in range(2,max_result+1):
    frequency_die=results_die.count(value)#计算各点数出现的频率
    frequencies_die.append(frequency_die)#存入列表中
print(f"两个骰子投掷的频率:\n{frequencies_die}")

'''可视化输出,柱状图显示出现的频率'''
from plotly.graph_objs import Bar,Layout
from plotly import offline
# 对结果进行可视化。
x_values = list(range(2, max_result + 1))
data = [Bar(x=x_values, y=frequencies_die)]
x_axis_config = {'title': '结果'}#x坐标label
y_axis_config = {'title': '结果的频率'}#y坐标label
#设置图标的title
my_layout = Layout(title=f"同时掷1个{die1.num_sides}个点和1个{die2.num_sides}个点的骰子 1000 次的结果",xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d12.html')

 结果:按照概率是符合实际的

两个骰子投掷的点数:
[7, 7, 11, 9, 11, 2, 10, 9, 10, 6, 10, 12, 3, 7, 5, 14, 9, 5, 9, 8, 10, 8, 5, 11, 9, 10, 8, 6, 9, 4, 7, 6, 6, 5, 7, 8, 10, 6, 12, 5, 12, 8, 3, 3, 10, 10, 7, 8, 14, 4, 9, 9, 14, 8, 5, 8, 7, 10, 8, 11, 14, 11, 13, 7, 12, 10, 9, 6, 7, 5, 9, 5, 6, 9, 10, 12, 5, 7, 8, 9, 11, 4, 5, 4, 7, 3, 12, 12, 10, 10, 6, 7, 10, 6, 6, 8, 12, 4, 11, 4, 3, 10, 5, 7, 9, 8, 10, 7, 9, 10, 7, 4, 9, 10, 8, 9, 7, 10, 2, 3, 6, 6, 4, 7, 8, 5, 11, 10, 8, 8, 8, 9, 12, 6, 7, 10, 3, 10, 3, 9, 9, 7, 7, 3, 4, 5, 9, 4, 6, 2, 5, 10, 12, 5, 6, 11, 9, 7, 9, 8, 9, 5, 5, 12, 8, 7, 8, 7, 10, 9, 9, 7, 12, 10, 6, 10, 12, 6, 6, 8, 5, 2, 7, 11, 10, 9, 6, 14, 5, 6, 11, 14, 6, 8, 5, 9, 7, 14, 8, 10, 7, 10, 10, 9, 12, 5, 8, 6, 4, 13, 12, 6, 4, 7, 7, 12, 13, 9, 5, 7, 11, 4, 10, 9, 11, 13, 13, 7, 10, 7, 9, 13, 7, 9, 10, 7, 9, 11, 6, 10, 11, 6, 8, 5, 3, 13, 8, 8, 12, 14, 9, 10, 7, 12, 7, 10, 6, 6, 7, 2, 8, 4, 5, 5, 8, 9, 13, 14, 13, 2, 13, 13, 9, 8, 7, 7, 10, 7, 7, 5, 10, 5, 4, 13, 2, 6, 8, 10, 10, 8, 10, 7, 10, 7, 10, 7, 12, 8, 12, 6, 8, 9, 5, 8, 6, 9, 5, 11, 5, 10, 7, 6, 7, 4, 9, 11, 12, 7, 3, 11, 10, 7, 13, 9, 10, 9, 11, 13, 9, 7, 9, 9, 7, 7, 9, 4, 5, 9, 10, 12, 2, 13, 12, 10, 12, 13, 5, 11, 7, 4, 9, 14, 7, 7, 5, 11, 11, 8, 11, 8, 9, 10, 12, 12, 11, 5, 7, 7, 6, 5, 5, 14, 8, 7, 2, 4, 8, 4, 6, 7, 5, 6, 7, 13, 10, 14, 4, 8, 9, 4, 10, 7, 12, 12, 11, 7, 6, 5, 4, 8, 3, 10, 3, 9, 12, 6, 6, 5, 9, 11, 5, 5, 5, 5, 8, 8, 10, 10, 5, 4, 6, 6, 2, 2, 12, 9, 7, 8, 11, 5, 9, 6, 5, 8, 9, 6, 10, 10, 13, 5, 8, 12, 6, 10, 10, 8, 10, 3, 11, 10, 9, 9, 9, 5, 13, 6, 10, 8, 8, 6, 6, 9, 6, 10, 6, 6, 9, 11, 10, 12, 11, 4, 6, 6, 9, 11, 5, 11, 10, 3, 11, 7, 6, 7, 6, 8, 10, 7, 10, 6, 7, 4, 6, 8, 5, 7, 12, 12, 8, 8, 9, 8, 4, 2, 12, 8, 6, 7, 5, 7, 9, 6, 8, 12, 8, 2, 8, 10, 7, 9, 6, 13, 11, 8, 9, 10, 8, 9, 6, 6, 6, 8, 6, 7, 7, 8, 7, 11, 13, 9, 6, 8, 5, 10, 9, 11, 6, 9, 8, 8, 6, 3, 7, 9, 11, 5, 12, 7, 7, 11, 8, 7, 14, 4, 7, 7, 4, 10, 7, 5, 6, 11, 7, 8, 14, 9, 7, 9, 12, 7, 7, 3, 9, 5, 9, 8, 6, 11, 5, 7, 2, 11, 5, 6, 13, 8, 9, 10, 9, 9, 9, 9, 6, 8, 3, 8, 10, 7, 4, 3, 7, 8, 5, 6, 10, 9, 8, 7, 7, 8, 9, 6, 11, 4, 7, 2, 12, 4, 6, 6, 14, 3, 8, 7, 7, 8, 5, 5, 10, 6, 9, 7, 14, 10, 13, 11, 6, 9, 11, 7, 4, 10, 2, 14, 11, 10, 5, 9, 9, 5, 9, 4, 7, 10, 6, 7, 9, 7, 12, 12, 6, 4, 10, 11, 8, 6, 12, 10, 9, 5, 5, 6, 9, 5, 13, 7, 9, 8, 13, 10, 4, 4, 7, 7, 12, 9, 13, 3, 5, 7, 5, 11, 9, 11, 10, 2, 12, 14, 9, 8, 12, 5, 12, 13, 8, 13, 2, 3, 6, 7, 6, 7, 8, 11, 9, 10, 9, 5, 8, 12, 7, 3, 7, 7, 7, 9, 13, 10, 7, 8, 5, 9, 9, 6, 11, 8, 11, 4, 9, 11, 11, 7, 11, 6, 10, 10, 12, 12, 5, 10, 8, 7, 5, 11, 12, 13, 11, 9, 11, 8, 5, 9, 10, 8, 8, 8, 10, 10, 12, 6, 8, 14, 9, 12, 11, 12, 7, 8, 9, 11, 7, 6, 10, 7, 9, 5, 8, 6, 6, 9, 9, 7, 4, 11, 12, 4, 9, 4, 4, 10, 10, 7, 4, 8, 8, 6, 11, 12, 6, 5, 10, 8, 5, 8, 6, 7, 11, 10, 6, 6, 8, 5, 11, 13, 7, 2, 10, 9, 4, 9, 6, 5, 7, 10, 5, 4, 6, 9, 9, 10, 4, 6, 13, 9, 10, 9, 8, 7, 5, 12, 6, 4, 9, 13, 11, 3, 12, 11, 6, 12, 9, 14, 7, 11, 6, 7, 4, 8, 9, 9, 7, 14, 8, 9, 8, 2, 10, 10, 11, 8, 10, 10, 11, 8, 7, 2, 10, 10, 10, 11, 9, 4, 4, 3, 7, 8, 10, 7, 10, 7, 7, 10, 7, 14, 3, 11, 3, 9, 11, 6, 9, 11, 4, 14, 4, 5, 6, 10, 2, 12, 10, 10, 4, 10, 12, 3, 10, 9, 11, 8, 7, 9, 11, 6, 6, 12, 3, 10, 7, 12, 11, 4, 6, 10, 12, 9, 4, 7, 5, 3, 10, 7, 6, 4, 12, 7, 11, 5, 14, 9, 8, 8, 8, 5, 9, 13, 6, 7, 9, 8, 7, 7, 4, 11, 8, 5, 6, 7, 10, 4, 11, 9, 9, 2, 7, 9, 9, 4, 3, 12]
两个骰子投掷的频率:
[23, 31, 59, 85, 105, 138, 110, 130, 118, 78, 65, 34, 24]

参考资料《python编程:从入门到实践》

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是用 Python 和 C3.js 实现旋转六边形的代码: ```python from math import pi, sin, cos # 定义旋转六边形的参数 num_sides = 6 radius = 100 angle = pi/6 # 计算旋转六边形的顶点坐标 points = [] for i in range(num_sides): x = radius * cos(i * angle) y = radius * sin(i * angle) points.append((x, y)) # 输出 C3.js 代码 print("var chart = c3.generate({") print(" data: {") print(" columns: [") for i in range(num_sides): x1, y1 = points[i] x2, y2 = points[(i+1)%num_sides] print(f" ['x{i}', {x1}, {x2}],") print(f" ['y{i}', {y1}, {y2}],") print(" ],") print(" type: 'area',") print(" groups: [[") for i in range(num_sides): print(f" 'x{i}', 'y{i}',") print(" ]],") print(" },") print(" transition: {") print(" duration: 0") print(" },") print(" axis: {") print(" x: {") print(" show: false,") print(" max: 1,") print(" min: -1") print(" },") print(" y: {") print(" show: false,") print(" max: 1,") print(" min: -1") print(" }") print(" },") print(" legend: {") print(" show: false") print(" },") print(" padding: {") print(" top: 0,") print(" right: 0,") print(" bottom: 0,") print(" left: 0,") print(" },") print("});") print("var i = 0;") print("setInterval(function() {") print(" chart.groups([[") for i in range(num_sides): print(f" 'x{(i+1)%num_sides}', 'y{(i+1)%num_sides}',") print(" ]]);") print(f" chart.transform('rotate', {i * angle * 180 / pi});") print(" i++;") print("}, 50);") ``` 这段代码会输出一个包含 C3.js 代码的字符串,可以直接将其复制到 HTML 文件中使用。这段代码会生成一个旋转六边形,并且会以每秒 20 帧的速度不停地旋转。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值