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

Fortran中if语句使用问题:100次掷骰子对战代码逻辑错误排查

Fortran掷骰子模拟代码错误分析

核心错误点

  • 初始化语句被跳过:你在生成x、y的随机值后直接执行goto 12,完全跳过了nx=0、ny=0、n=0这三行初始化代码,三个计数变量的初始值为内存随机垃圾值,不是预期的0,直接导致计数结果不符合逻辑。
  • 仅打印骰子点数未存储:你当前的判断分支只打印了x、y对应的骰子点数,没有将点数赋值给整数变量存储,后续比较的还是rand()返回的0~1原始浮点数,虽然二者大小正相关,但存在边界值(如刚好等于1/6、2/6等)时没有匹配分支,也容易出现逻辑误差。
  • 区间判断使用开区间有边界遗漏:rand()返回值范围通常是[0,1),你用x>0、x<1./6这类开区间判断,会导致x=0、x=1./6这类边界值没有匹配的分支,虽然出现概率极低,但存在逻辑漏洞。

修正方案

  1. 把初始化代码nx=0、ny=0、n=0放到程序最开头,CALL RANDOM_SEED之后即可,避免被goto跳过。
  2. 新增两个整数变量xd、yd存储x、y对应的骰子点数,后续比较这两个整数的大小即可。
  3. 优化区间判断逻辑,直接用整数转换公式xd = FLOOR(x*6) + 1直接生成1~6的整数点数,替代冗长的if分支。

修正后的完整代码

CALL RANDOM_SEED
      ! 初始化计数变量放到最开头
      nx=0
      ny=0
      n=0
1     x=rand()
      ! 直接生成1~6的整数骰子点数,无需多分支判断
      xd = FLOOR(x*6) + 1
      print*,"x=",xd
      y=rand()
      yd = FLOOR(y*6) + 1
      print*,"y=",yd
12    if(xd>yd)then
          nx=nx+1
        elseif(yd>xd)then
          ny=ny+1
        endif
        print*,"nx=",nx,"ny=",ny
        n=n+1
        if(n<101)goto 1
      ! 输出最终结果
        if(nx>ny)then
          print*,"最终获胜方为x,得分:",nx
        elseif(ny>nx)then
          print*,"最终获胜方为y,得分:",ny
        else
          print*,"双方平局,得分均为:",nx
        endif
        pause
        stop
      end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:06:04