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

自定义上下限骰子生成器:寻求替代低效循环的高效方案

高效解决MinMaxDice的掷骰范围限制问题

原代码通过do-while循环过滤超出骰子面数的结果,存在理论上的性能隐患——当设置的max远大于sides时,会反复生成无效值,浪费计算资源。其实完全不需要循环,只需先修正有效的掷骰范围,再在合法区间内生成随机数即可。

核心思路

  1. 修正有效最大值:取用户设置的max与骰子面数sides的较小值,确保结果不会超过骰子上限
  2. 修正有效最小值:取用户设置的min与骰子最小面数(默认1)的较大值,避免出现小于1的无效结果
  3. 处理极端输入:如果用户传入的min大于max,直接交换两者,保证范围合法
  4. 在修正后的合法区间内一次性生成随机数,彻底消除循环带来的性能问题

优化后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:17:38