刚学python,感觉写得没问题,一直不成功
y轴刻度对不上,数据也对不上
from random import randint
from plotly.graph_objs import Bar,Layout
from plotly import offline
class Die:
'''创建一个骰子的类'''
def __init__(self,sides=6):
'''初始设置,默认骰子为6面'''
self.sides = sides
self.results = []
self.frequencies = []
def roll(self,num=1):
'''掷骰子,默认一次'''
self.num = num
for i in range(0,num):
self.results.append(randint(1,self.sides))
def analyse_frequency(self):
'''分析每个点数的频率'''
for value in range(1,self.sides+1):
frequency = self.results.count(value)
self.frequencies.append(frequency)
def ans_visable(self):
'''数据可视化'''
x_values = list(range(1,self.sides+1))
#Bar不能直接接受range的结果,需使用list()
data = [Bar(x=x_values,y=self.frequencies)]
#配置图表
x_axis_config = {'title' : '结果'}
y_axis_config = {'title' : '结果的频率'}
#反回指定图表和配置的对象
my_layout = Layout(title=f'掷骰子{self.num}结果',xaxis=x_axis_config,yaxis=y_axis_config)
#离线作图
offline.plot({'data':data,'layout':my_layout} ,filename='d6.html')
if __name__ == '__main__':
die_1 = Die()
die_2 = Die()
die_1.roll(1000)
die_2.roll(1000)
results = []
frequencies = []
#计算结果
for num in range(0,1000):
result = die_1.results[num] + die_2.results[num]
results.append(result)
# 统计结果
for value in range(2,die_1.sides+die_2.sides+1):
frequency = results.count(value)
frequencies.append(frequency)
#可视化
x_values = list(range(2,die_1.sides+die_2.sides+1))
data = [Bar(x=x_values,y=frequencies)]
#配置图表
x_axis_config = {'title' : '结果'}
y_axis_config = {'title' : '结果的频率'}
#反回指定图表和配置的对象
my_layout = Layout(title='掷骰子的结果',xaxis=x_axis_config,yaxis=y_axis_config)
#离线作图
offline.plot({'data':data,'layout':my_layout} ,filename='ans.html')
求解答
你输出一下results和frequencies ,结果没问题。
伪随机数有一定的规律的,并不是真随机。
【以下回答由 GPT 生成】
你的代码存在一些问题。以下是问题的分析和解决方案:
Die
类的 analyse_frequency
方法中清空之前的频率数据,导致每次分析时都会将新的频率数据追加到之前的结果中。所以当你多次调用 roll
方法时,会导致频率数据累积并错误地显示在图表中。你应该在 analyse_frequency
方法中添加 self.frequencies.clear()
来清空之前的数据。在 Die
类的 ans_visable
方法中,你没有调用 analyse_frequency
方法来计算频率数据。所以你应该在 ans_visable
方法中添加 self.analyse_frequency()
调用。
数据收集和统计:
results
和 frequencies
来分别存储结果和频率数据。但是,这并不是必要的。你可以直接在 Die
类的 roll
方法中添加结果到 self.results
列表,并在 analyse_frequency
方法中计算频率数据并存储在 self.frequencies
列表中。这样可以简化代码并避免出错。Die
类的 roll
方法中实现两个骰子的掷Dice并计算结果和频率。以下是修改后的代码:
from random import randint
from plotly.graph_objs import Bar, Layout
from plotly import offline
class Die:
'''创建一个骰子的类'''
def __init__(self, sides=6):
'''初始设置,默认骰子为6面'''
self.sides = sides
self.results = []
self.frequencies = []
def roll(self, num=1):
'''掷骰子,默认一次'''
self.num = num
self.results.clear() # 清空之前的结果
for _ in range(num):
self.results.append(randint(1, self.sides))
def analyse_frequency(self):
'''分析每个点数的频率'''
self.frequencies.clear() # 清空之前的频率数据
for value in range(1, self.sides+1):
frequency = self.results.count(value)
self.frequencies.append(frequency)
def ans_visable(self):
'''数据可视化'''
self.analyse_frequency() # 计算频率数据
x_values = list(range(1, self.sides+1))
data = [Bar(x=x_values, y=self.frequencies)]
x_axis_config = {'title': '结果'}
y_axis_config = {'title': '结果的频率'}
my_layout = Layout(title=f'掷骰子{self.num}结果', xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d6.html')
if __name__ == '__main__':
die_1 = Die()
die_2 = Die()
die_1.roll(1000)
die_2.roll(1000)
# 计算结果和频率
results = []
for num in range(1000):
results.append(die_1.results[num] + die_2.results[num])
x_values = list(range(2, 13))
data = [Bar(x=x_values, y=results.count(num+2) for num in range(2, 13))]
x_axis_config = {'title': '结果'}
y_axis_config = {'title': '结果的频率'}
my_layout = Layout(title='两个骰子相加结果的频率', xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d6.html')
这些修改应该解决你的问题。希望对你有帮助!如果你还有其他问题,请随时提问。
【相关推荐】