AnyLogic模拟80%良品率时缺陷计数始终为0的问题排查
问题分析与解决办法
你的代码错误核心原因
你写的条件判断逻辑出了问题,直接导致parts_defect永远不会被触发:
- 第一个
if里用了逻辑或(||):-2<probability || probability<2,这个条件对所有实数都成立——任何随机数要么大于-2,要么小于2,所以每次都会执行parts_count +=1,永远走不到后续分支。 - 第二个
else if的条件本身逻辑也有误,就算第一个条件改对,-2>probability || probability>2的写法也冗余,而且没必要用else if,直接用else就足够。
修正后的正态分布测试代码
把逻辑或改成逻辑与,同时简化分支判断:
double probability = normal(); if (-2 < probability && probability < 2) { parts_count += 1; } else { parts_defect +=1; }
更贴合你需求的方案(80%良品率)
既然你的目标是模拟80%的良品率,用正态分布其实没必要,直接用均匀分布随机数更直观且精准:
// 生成0到1之间的均匀随机数,小于0.8则判定为良品 if (uniform(0, 1) < 0.8) { parts_count += 1; } else { parts_defect += 1; }
或者用百分比形式的随机数,可读性更强:
if (uniform(0, 100) < 80) { parts_count += 1; } else { parts_defect += 1; }
小提示
AnyLogic里的随机数函数(比如normal()、uniform())都是内置封装好的,不需要额外调用外部库,基础语法和Java一致,重点要区分**逻辑与(&&)和逻辑或(||)**的适用场景——当需要同时满足多个条件时用&&,满足任一条件时用||。
内容的提问来源于stack exchange,提问作者Ismail
相关产品推荐
相关产品推荐

