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这类边界值没有匹配的分支,虽然出现概率极低,但存在逻辑漏洞。
修正方案
- 把初始化代码
nx=0、ny=0、n=0放到程序最开头,CALL RANDOM_SEED之后即可,避免被goto跳过。 - 新增两个整数变量
xd、yd存储x、y对应的骰子点数,后续比较这两个整数的大小即可。 - 优化区间判断逻辑,直接用整数转换公式
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
相关产品推荐
相关产品推荐

