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

如何让两个随机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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:09:02