连续生成随机枚举值且不重复

4

我有一个枚举类型 Teams,我想要将其随机化。所以我有以下代码:

public enum Teams { TEAM1, TEAM2, TEAM3, TEAM4, TEAM5, TEAM6; }

我有一个随机方法来随机生成值:
public static Teams getRandomTeam() {
    return Teams.values()[(int) (Math.random() * Teams.values().length)];
}

这段代码可以返回一个随机生成的团队,但是我需要做到一旦生成了一个名为TEAM2的团队,就不能再次生成。

我正在使用:

System.out.println("The team is " + getRandomTeam());
System.out.println("The team is " + getRandomTeam());
System.out.println("The team is " + getRandomTeam());
System.out.println("The team is " + getRandomTeam());
System.out.println("The team is " + getRandomTeam());
System.out.println("The team is " + getRandomTeam());

我知道目前的做法是错误的,因为它会一遍又一遍地调用这个方法。

目前当我运行程序时,输出结果可能是:

队伍是:TEAM2

队伍是:TEAM2

队伍是:TEAM4

队伍是:TEAM2

队伍是:TEAM3

队伍是:TEAM2

但我需要我的程序只输出一次枚举值。

谢谢。


4
如果你有6个团队并调用方法7次,会发生什么? - assylias
你需要枚举的排列,而不是独立地选择随机元素。看一下如何生成随机排列 - Vincent van der Weele
4个回答

10

只需使用Collections.shuffle即可。

List<Team> teams = new ArrayList<>();
Collections.addAll(teams, Team.values());
Collections.shuffle(teams);

5
最好对集合进行洗牌并逐个返回元素。
  private static List<Teams> tList;

  private static void regenerateList() {
      tList = new ArrayList<Teams>(Arrays.asList(Teams.values()));
      Collections.shuffle(tList);
  }

  public static Teams getRandomTeam() {
      if (tList.size() > 0) {
         return tList.remove(0);
      } else {
          //handle as you wish: return null or regenerate the list 
         regenerateList();
         return getrandomTeam();
      }
  }

1

这是什么?它是递归的!

public static enum TEAMS {
    TEAM1, TEAM2, TEAM3, TEAM4, TEAM5, TEAM6;
}

TEAMS[] teams = TEAMS.values();
Random rnd = new Random();

public TEAMS getnextRandomTeam() {
    int indx = rnd.nextInt(teams.length);
    TEAMS t = teams[indx];
    teams[indx] = null;
    return t == null ? getnextRandomTeam() : t;
}

0
使用集合的shuffle方法:
List<Teams> teams = new ArrayList<Teams>(Arrays.asList(Teams.values()));
int index = Integer.MAX_VALUE;

public Teams getRandomTeam() {
    if (index >= teams.size()) {
        Collections.shuffle(teams);
        index = 0;
    }
    return teams.get(index++);
}

这段代码以随机顺序返回所有值,并在耗尽列表时重置列表,以无限重复该过程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接