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

Python循环绘制点数问题:掷骰子指数衰减绘图逻辑故障

分析与修正:掷骰子指数衰减可视化异常问题

我看你在做掷骰子的指数衰减点数可视化时碰到了异常,先帮你梳理下——这大概率是代码里的绘图逻辑疏漏,不是绘图系统的故障哦~

先看你给出的截断代码

import math
import numpy as np
import matplotlib.pyplot as plt
import random
N = int(input('Enter Total Number Of Dice: '))
S = int(input('Enter Number of Sides on Each Dice: '))
xval = []
yval = []
count = 0
max1 = N
xval.append(0)
yval.append(N)
numOfTurns = 1
while(N != 0):
    for i in range(0, N):
        x = random.randint(1 , S)
        count = 0
        if(N == max1 / 2):
            plt.axvline(numOfTur...

代码里的核心问题

  • 代码截断:plt.axvline(numOfTur...没写完,这会直接导致语法错误,程序根本跑不起来
  • 条件判断失效:if(N == max1 / 2)这个逻辑有问题——如果初始骰子数max1是奇数,max1/2是小数,而N是整数,这个条件永远不会触发;就算是偶数,也可能因为N的变化跳过这个值(比如一次移除多个骰子)
  • 数据收集不完整:你只在开头给xval和yval加了初始值,但循环里没有持续记录每一轮的numOfTurns和当前N,最后绘图时没有足够的数据点
  • 循环逻辑缺失:代码里没有处理掷骰子后N的更新规则(比如是不是掷出1就移除这个骰子?),没有N的变化的话,while(N != 0)会无限循环

修正后的示例代码

假设你的规则是:每轮掷所有剩余骰子,掷出1的骰子被移除,记录每轮剩余的骰子数,同时在剩余骰子数降到初始一半时画一条竖线,最终绘制衰减曲线:

import matplotlib.pyplot as plt
import random

# 获取输入
N = int(input('Enter Total Number Of Dice: '))
S = int(input('Enter Number of Sides on Each Dice: '))

# 初始化数据存储
xval = [0]  # 轮次,0是初始状态
yval = [N]  # 对应轮次的剩余骰子数
max_dice = N
num_of_turns = 1
half_mark_drawn = False  # 标记是否已经画过半值竖线

# 模拟掷骰子过程
while N > 0:
    removed = 0
    # 遍历当前所有骰子
    for _ in range(N):
        roll = random.randint(1, S)
        # 假设掷出1就移除这个骰子
        if roll == 1:
            removed += 1
    # 更新剩余骰子数
    N -= removed
    # 记录当前轮次的数据
    xval.append(num_of_turns)
    yval.append(N)
    
    # 修正条件判断:用小于等于代替等于,避免错过触发时机,且只画一次
    if not half_mark_drawn and N <= max_dice / 2:
        plt.axvline(x=num_of_turns, color='r', linestyle='--', label='Half Dice Remaining')
        half_mark_drawn = True
    
    num_of_turns += 1

# 绘制衰减曲线
plt.plot(xval, yval, marker='o', linestyle='-', label='Remaining Dice')
plt.xlabel('Number of Turns')
plt.ylabel('Remaining Dice Count')
plt.title('Dice Roll Exponential Decay')
plt.legend()
plt.grid(True)
plt.show()

关键修改说明

  1. 补全了骰子移除逻辑:明确每轮统计被移除的骰子数,更新N的值,让循环能正常结束
  2. 完善数据收集:每轮结束后把当前轮次和剩余骰子数加入xval和yval,保证绘图有完整的曲线数据
  3. 修正竖线触发逻辑:用N <= max_dice / 2代替等于,同时加了half_mark_drawn标记确保只画一次竖线,避免重复触发
  4. 补全了完整绘图流程:添加了坐标轴标签、标题、图例和网格,让可视化更清晰直观

内容的提问来源于stack exchange,提问作者Wow Facts Wrong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:33:21