如何让两个随机Feat生成器不输出重复结果 附现有Java实现代码
现有代码的可优化点
- 两个存储Feat的数组内容完全一致,没有重复定义的必要
- 数组实际长度为17,你当前使用
Math.random() * 16只能生成0-15的随机数,最后一个元素Shield Master永远不会被选中
实现方案1:简单循环去重(改动最小)
逻辑非常直接,生成Feat2的下标后判断是否和Feat1的下标相同,如果相同就重新生成,直到两个值不同即可,修改后代码如下:
System.out.println("Feat 1:"); // 复用同一个数组即可 String[] feats = {"Actor", "Athlete", "Dragon Hide", "Dual Wielder", "Durable", "Elven Accuracy", "Firearm Specialist", "Healer", "Heavily Armored", "Martial Adept", "Mobile", "Moderately Armored", "Mounted Combatant", "Resilient", "Ritual Caster", "Ambidextrous", "Shield Master"}; // 修正随机数范围,直接用数组长度适配,后续修改数组内容不用改随机数参数 int feat1 = (int) (Math.random() * feats.length); System.out.println(feats[feat1]); System.out.println("\nFeat 2:"); int feat2; // 循环直到生成和feat1不同的下标 do { feat2 = (int) (Math.random() * feats.length); } while (feat2 == feat1); System.out.println(feats[feat2]); System.out.println("\n");
实现方案2:洗牌法(支持扩展取N个不重复元素)
如果后续有取更多不重复Feat的需求,用集合洗牌的方式更简洁,不需要额外写多次判断逻辑:
import java.util.Arrays; import java.util.Collections; import java.util.List; // ... 你的其他业务代码 System.out.println("Feat 1:"); String[] feats = {"Actor", "Athlete", "Dragon Hide", "Dual Wielder", "Durable", "Elven Accuracy", "Firearm Specialist", "Healer", "Heavily Armored", "Martial Adept", "Mobile", "Moderately Armored", "Mounted Combatant", "Resilient", "Ritual Caster", "Ambidextrous", "Shield Master"}; List<String> featList = Arrays.asList(feats); // 打乱列表整体顺序 Collections.shuffle(featList); // 直接取前两个元素,天然不重复 System.out.println(featList.get(0)); System.out.println("\nFeat 2:"); System.out.println(featList.get(1)); System.out.println("\n");
两种方案都能稳定实现两个Feat不重复的需求,方案1适合仅取2个元素的轻量化场景,方案2适合后续可能需要扩展取更多不重复元素的场景。
内容的提问来源于stack exchange,提问作者Jihyorno
相关产品推荐
相关产品推荐

