Java中如何让掷骰方法根据参数条件返回多次随机结果?
解决方案:返回多次掷骰的结果集合或总和
你没法让一个Java方法多次返回值,但可以把多次掷骰的结果收集起来,一次性返回。这里提供两种常见的实现方式,根据你的需求选择:
1. 返回每次掷骰的具体结果(适合需要展示单个骰子数值的场景)
修改方法返回类型为List<Integer>,循环指定次数生成随机数并加入列表:
import java.util.ArrayList; import java.util.List; import java.util.concurrent.ThreadLocalRandom; public class DiceRoller { public static List<Integer> roll(int sides, int amount) { List<Integer> results = new ArrayList<>(); // 骰子范围是1到sides(包含),所以nextInt用[1, sides+1)的左闭右开区间 int minRoll = 1; int maxRollExclusive = sides + 1; for (int i = 0; i < amount; i++) { int singleRoll = ThreadLocalRandom.current().nextInt(minRoll, maxRollExclusive); results.add(singleRoll); } return results; } }
调用示例:
// 掷3次6面骰 List<Integer> rolls = DiceRoller.roll(6, 3); System.out.println("掷骰结果:" + rolls); // 示例输出:[2, 5, 1]
2. 返回多次掷骰的总和(适合计算伤害、属性值等场景)
如果只需要总点数,直接返回int类型的总和即可:
import java.util.concurrent.ThreadLocalRandom; public class DiceRoller { public static int rollTotal(int sides, int amount) { int total = 0; int minRoll = 1; int maxRollExclusive = sides + 1; for (int i = 0; i < amount; i++) { total += ThreadLocalRandom.current().nextInt(minRoll, maxRollExclusive); } return total; } }
调用示例:
// 计算2d6的总点数 int total = DiceRoller.rollTotal(6, 2); System.out.println("总点数:" + total); // 示例输出:7
原代码的几个问题说明
- 静态变量风险:你之前用了
numSides、amount这类静态变量,多线程调用或连续调用时会被覆盖,导致结果错误,直接用方法参数更安全。 - 随机数范围错误:
ThreadLocalRandom.nextInt(origin, bound)是左闭右开区间,原代码里nextInt(lowestRoll, numSides)会生成lowestRoll到numSides-1的数,比如6面骰只能生成1-5,改成numSides+1作为bound才能得到1-6的正确结果。 - 错误的语法尝试:你之前写的
ThreadLocalRandom * amount完全不符合Java语法,循环才是实现多次生成随机数的正确方式。
内容的提问来源于stack exchange,提问作者canadaGoose
相关产品推荐
相关产品推荐

