自定义上下限骰子生成器:寻求替代低效循环的高效方案
高效解决MinMaxDice的掷骰范围限制问题
原代码通过do-while循环过滤超出骰子面数的结果,存在理论上的性能隐患——当设置的max远大于sides时,会反复生成无效值,浪费计算资源。其实完全不需要循环,只需先修正有效的掷骰范围,再在合法区间内生成随机数即可。
核心思路
- 修正有效最大值:取用户设置的
max与骰子面数sides的较小值,确保结果不会超过骰子上限 - 修正有效最小值:取用户设置的
min与骰子最小面数(默认1)的较大值,避免出现小于1的无效结果 - 处理极端输入:如果用户传入的
min大于max,直接交换两者,保证范围合法 - 在修正后的合法区间内一次性生成随机数,彻底消除循环带来的性能问题
优化后的MinMaxDice代码
import java.util.concurrent.ThreadLocalRandom; public class MinMaxDice extends Dice { int max; int min; MinMaxDice(int sides, int min, int max) { super(sides); // 初始化阶段完成范围修正,避免每次掷骰重复计算 this.min = Math.max(1, min); this.max = Math.min(sides, max); // 处理min大于max的极端输入 if (this.min > this.max) { int temp = this.min; this.min = this.max; this.max = temp; } } public int rollDie() { // 计算合法区间的长度,nextInt参数为开区间,需+1 int range = this.max - this.min + 1; return this.min + ThreadLocalRandom.current().nextInt(range); } }
关键改进点
- 初始化时修正范围:在构造函数中完成所有边界校验,无需每次掷骰重复计算,提升效率
- 移除循环逻辑:直接在合法区间生成随机数,一次调用即可得到符合要求的结果,彻底规避循环风险
- 鲁棒性提升:处理用户输入的异常情况(如min>max),保证代码不会因非法输入出错
例如创建MinMaxDice d20 = new MinMaxDice(20, 10, 25)时,构造函数会自动将max修正为20,rollDie()会直接在10-20区间内生成随机数,完全满足需求。
内容的提问来源于stack exchange,提问作者HermitIX
相关产品推荐
相关产品推荐

