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

Python新手求助:双骰子掷骰循环程序的打印次数及结果计数实现

解决方案:双骰子掷骰统计程序

嗨,你已经有了不错的开头,不过要实现计数功能,核心要点是把计数器初始化在while循环外面(不然每次循环都会重置为0,完全没法累计统计),然后在每次符合对应条件时给计数器加1。下面是完整的实现代码,我会一步步拆解关键逻辑:

完整代码

import random

# 定义骰子面数,这里默认用6面骰子
sides = 6

# 初始化所有计数器,必须放在循环外部!
total_rolls = 0
odds_count = 0          # 两个骰子均为奇数的次数(包含奇数对子)
evens_count = 0         # 两个骰子均为偶数的次数(包含偶数对子)
doubles_count = 0       # 所有对子的总次数(无论奇偶)
# 各打印内容的专属计数器
snake_eyes_print = 0
evens_doubles_sum_print = 0
evens_doubles_highroll_print = 0
evens_doubles_print = 0
evens_only_print = 0
odds_doubles_print = 0
odds_only_print = 0
mixed_roll_print = 0

condition2 = False 
while not condition2: 
    total_rolls += 1  # 每次循环对应一次掷骰,总次数加1
    die1 = random.randint(1, sides) 
    die2 = random.randint(1, sides) 
    
    # 先判断是否掷出对子
    is_double = (die1 == die2)
    if is_double:
        doubles_count += 1  # 对子计数加1
    
    # 判断当前掷骰属于双偶、双奇还是混合奇偶
    both_even = (die1 % 2 == 0) and (die2 % 2 == 0)
    both_odd = (die1 % 2 != 0) and (die2 % 2 != 0)
    
    if both_even:
        evens_count += 1
        # 处理偶数类的打印逻辑
        if is_double:
            if die1 + die2 == sides:  # 按你原代码的逻辑判断和为sides的偶数对子
                print(f"die #1 is *{die1}* and die #2 is *{die2}* Evens! Doubles! Sum is size value!")
                evens_doubles_sum_print += 1
            elif die1 == 6 and die2 == 6:
                print(f"die #1 is *{die1}* and die #2 is *{die2}* Evens! Doubles! High Roll!")
                evens_doubles_highroll_print += 1
            else:
                print(f"die #1 is *{die1}* and die #2 is *{die2}* Evens! Doubles!")
                evens_doubles_print += 1
        else:
            print(f"die #1 is *{die1}* and die #2 is *{die2}* Evens!")
            evens_only_print += 1
    elif both_odd:
        odds_count += 1
        # 处理奇数类的打印逻辑
        if is_double:
            if die1 == 1 and die2 == 1:
                print(f"die #1 is *{die1}* and die #2 is *{die2}* Snake Eyes!")
                snake_eyes_print += 1
                condition2 = True  # 掷出Snake Eyes,终止循环
            else:
                print(f"die #1 is *{die1}* and die #2 is *{die2}* Odds! Doubles!")
                odds_doubles_print += 1
        else:
            print(f"die #1 is *{die1}* and die #2 is *{die2}* Odds!")
            odds_only_print += 1
    else:
        # 一奇一偶的混合情况,不属于你定义的Odds或Evens
        print(f"die #1 is *{die1}* and die #2 is *{die2}* Mixed Roll!")
        mixed_roll_print += 1

# 循环结束后输出所有统计结果
print("\n=== 掷骰统计结果 ===")
print(f"总掷骰次数: {total_rolls}")
print(f"双奇结果次数: {odds_count}")
print(f"双偶结果次数: {evens_count}")
print(f"对子总次数: {doubles_count}")

print("\n=== 打印内容次数统计 ===")
print(f"Snake Eyes 打印次数: {snake_eyes_print}")
print(f"Evens+Doubles+Sum 打印次数: {evens_doubles_sum_print}")
print(f"Evens+Doubles+High Roll 打印次数: {evens_doubles_highroll_print}")
print(f"Evens+Doubles 打印次数: {evens_doubles_print}")
print(f"仅Evens 打印次数: {evens_only_print}")
print(f"Odds+Doubles 打印次数: {odds_doubles_print}")
print(f"仅Odds 打印次数: {odds_only_print}")
print(f"混合奇偶掷骰打印次数: {mixed_roll_print}")

关键逻辑说明

  1. 计数器初始化:所有统计用的变量必须放在while循环外面,否则每次循环都会重置为0,完全无法累计数据。
  2. 总掷骰次数统计:每次进入循环就执行total_rolls +=1,因为每次循环对应一次完整的掷骰操作。
  3. 分类计数:
    • 先判断是否是对子,统一维护doubles_count;
    • 再区分双偶、双奇、混合奇偶三类,分别给evens_count和odds_count累计;
  4. 打印次数统计:每执行一次print语句,就给对应的打印计数器加1,这样就能精准统计每种输出的出现次数。
  5. 循环终止条件:当掷出双1(Snake Eyes)时,将condition2设为True,循环自动终止。

修正的原代码问题

  • 你原代码里的random.randint(1,sides+1)是错误的,randint是左右闭区间,6面骰子应该用random.randint(1, sides);
  • 原代码里的die1 + die1 == die2逻辑有误,我改成了用is_double变量统一判断对子,逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:52:27