You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用变量与掷骰方法实现骰子结果对比及代码问题排查

问题原因及修复方案

核心错误点

  • 变量作用域与缩进错误:count_number_of_wins函数内的计数变量(die_A_larger等)仅在函数内部可见,但循环代码缩进错误,脱离了函数体,导致循环无法访问这些变量;同时函数未执行循环就直接返回初始值,完全没实现掷骰子对比逻辑。
  • 类属性与索引错误:die类的roll方法误用了未定义的self.sides属性,正确属性应为self.side_values;且np.random.randint(1,7)生成1-6的整数,而列表索引是0-5,会触发索引越界异常。
  • 对象比较逻辑错误:直接对比骰子对象(A > B)而非掷出的点数,必须调用roll()方法获取每次的点数后再比较。
  • 断言逻辑错误:determine_best_die中的断言错误,die是自定义类实例,不是列表,应检查die.side_values的长度是否为6。

修复后的完整代码

import numpy as np

class die:
    def __init__(self, side_values=[1,2,3,4,5,6]):
        self.side_values = side_values

    def roll(self):
        # 修复:使用正确的属性名,且索引范围改为0-5
        i = np.random.randint(0, 6)
        return self.side_values[i]

# 定义骰子与对比次数
A = die([3,3,3,3,3,6])
B = die([2,2,2,5,5,5])
C = die([1,4,4,4,4,4])
nmax = 5782

def count_number_of_wins(die_x, die_y):
    die_x_larger = 0
    die_y_larger = 0
    equal_count = 0

    # 修复:循环缩进至函数内部,每次掷骰子后对比点数
    for _ in range(nmax):
        x_roll = die_x.roll()
        y_roll = die_y.roll()
        if x_roll > y_roll:
            die_x_larger += 1
        elif x_roll < y_roll:
            die_y_larger += 1
        else:
            equal_count += 1
    
    return (die_x_larger, die_y_larger, equal_count)

# 执行所有对比并输出结果
a_vs_b = count_number_of_wins(A, B)
a_vs_c = count_number_of_wins(A, C)
b_vs_c = count_number_of_wins(B, C)

print(f"A vs B: A胜{a_vs_b[0]}次,B胜{a_vs_b[1]}次,平局{a_vs_b[2]}次")
print(f"A vs C: A胜{a_vs_c[0]}次,C胜{a_vs_c[1]}次,平局{a_vs_c[2]}次")
print(f"B vs C: B胜{b_vs_c[0]}次,C胜{b_vs_c[1]}次,平局{b_vs_c[2]}次")

def determine_best_die(dice):
    # 修复:断言检查骰子的面数是否为6
    assert all(len(d.side_values) == 6 for d in dice)

    wins = [0] * len(dice)

    for i in range(len(dice)):
        for j in range(i+1, len(dice)):
            x_wins, y_wins, _ = count_number_of_wins(dice[i], dice[j])
            if x_wins > y_wins:
                wins[i] += 1
            elif y_wins > x_wins:
                wins[j] += 1
            # 平局时双方都不增加胜场计数
    
    # 找出胜场最多的骰子索引
    max_wins = max(wins)
    if max_wins == len(dice)-1:
        return wins.index(max_wins)
    return -1

# 可选:调用最佳骰子判断函数
best_idx = determine_best_die([A, B, C])
print(f"最佳骰子索引(0=A,1=B,2=C):{best_idx}")

修复说明

  1. 类方法修复:将roll方法中的属性改为self.side_values,并把随机索引范围调整为0-5,避免越界。
  2. 函数逻辑修复:把循环代码缩进至count_number_of_wins函数内部,每次循环调用两个骰子的roll()方法获取点数,再进行对比计数。
  3. 对比逻辑修复:替换对象直接比较为点数比较,确保每次对比的是实际掷出的结果。
  4. 断言修复:修改断言逻辑,检查骰子实例的side_values长度是否为6,符合需求。
  5. 结果输出优化:增加了所有对比组合的结果输出,直接展示A/B、A/C、B/C的胜负平次数。

内容的提问来源于stack exchange,提问作者Math26n

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:25:28