使用python模拟掷骰子一直不行,实在找不到问题

刚学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')

img

求解答

你输出一下results和frequencies ,结果没问题。
伪随机数有一定的规律的,并不是真随机。

【以下回答由 GPT 生成】

你的代码存在一些问题。以下是问题的分析和解决方案:

  1. 数据分析和可视化:
  2. 你没有在 Die 类的 analyse_frequency 方法中清空之前的频率数据,导致每次分析时都会将新的频率数据追加到之前的结果中。所以当你多次调用 roll 方法时,会导致频率数据累积并错误地显示在图表中。你应该在 analyse_frequency 方法中添加 self.frequencies.clear() 来清空之前的数据。
  3. Die 类的 ans_visable 方法中,你没有调用 analyse_frequency 方法来计算频率数据。所以你应该在 ans_visable 方法中添加 self.analyse_frequency() 调用。

  4. 数据收集和统计:

  5. 在主函数中,你使用两个单独的列表 resultsfrequencies 来分别存储结果和频率数据。但是,这并不是必要的。你可以直接在 Die 类的 roll 方法中添加结果到 self.results 列表,并在 analyse_frequency 方法中计算频率数据并存储在 self.frequencies 列表中。这样可以简化代码并避免出错。
  6. 在主函数中,你使用了两个循环来计算两个骰子相加的结果并统计频率。但是,你可以直接在 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')

这些修改应该解决你的问题。希望对你有帮助!如果你还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^