如何使用给定数量的属性生成给定数量的随机对象?

时间:2017-04-08 19:51:21

标签: java object random enums

我的问题是,如何使用给定数量(4-8)的试验产生随机挑战?

挑战来自试验(参见下面的代码)。

试验是Challenge类的属性,由枚举和EnumMap构建。

因此,当我在main中获得一个随机数(如r.nextInt(4) + 4;)时,我将为挑战生成该数量的试验,如下所示

Weapons = 25;
Hacking = 32;
Vehicle = 34;
Speed = 56;

因此,对于1次挑战,我不需要所有的试验,只需要其中一些试验。但我仍然需要随机选择它们(4 - 8)。

如何使用给定数量的属性(及其值)生成这些随机Challenge对象?所以基本上是其中一些,来自所有人。

这都错了吗?我该怎么开始呢?

到目前为止的代码:

import java.util.*;

public class Challenge {
    Random r = new Random();

    // DRIVE, VEHICLE, ACCURACY, WEAPONS, REFLEX, STRATEGY, CHARISMA, HACKING,
    // SPEED, STEALTH;
    public static enum Trial {
        DRIVE, VEHICLE, ACCURACY, WEAPONS, REFLEX, STRATEGY, CHARISMA, HACKING, SPEED, STEALTH;
    }

    Map<Trial, Integer> challenge = new EnumMap<Trial, Integer>(Trial.class);

    public Challenge() {
        challenge.put(Trial.DRIVE, r.nextInt(100) + 25);
        challenge.put(Trial.VEHICLE, r.nextInt(100) + 25);
        challenge.put(Trial.ACCURACY, r.nextInt(100) + 25);
        challenge.put(Trial.WEAPONS, r.nextInt(100) + 25);
        challenge.put(Trial.REFLEX, r.nextInt(100) + 25);
        challenge.put(Trial.STRATEGY, r.nextInt(100) + 25);
        challenge.put(Trial.CHARISMA, r.nextInt(100) + 25);
        challenge.put(Trial.HACKING, r.nextInt(100) + 25);
        challenge.put(Trial.SPEED, r.nextInt(100) + 25);
        challenge.put(Trial.STEALTH, r.nextInt(100) + 25);
    }

    List<Trial> keys = new ArrayList<Trial>(challenge.keySet());
    Trial randomKey = keys.get(r.nextInt(keys.size()));
    Integer value = challenge.get(randomKey);
}

3 个答案:

答案 0 :(得分:2)

如果我正确地阅读了您的问题,您会问:如何以随机的方式选择其中一个枚举?

如果是这样;您可以使用values()将所有枚举常量放入数组中;然后只需在该数组中选择一个随机条目。或者,你可以简单地改组那个数组;并始终返回第一个元素。

Trial allTrials[] = Trial.values();
Random random = new Random();

Trial pickRandomTrial() {
  return allTrials[random.nextInt(allTrials.length)];
}

答案 1 :(得分:2)

说,您希望tint t = random.nextInt(5) + 4次试验产生挑战,4 <= t <= 8random.nextInt(100) + 25(注意nextInt的约束是独占< / em>的)。如果我正确阅读您的代码,则每个试用版的相关值都为t(因此介于25和124之间)。

您可以按照以下方式执行此操作。我们创建一个包含所有试验的数组,并通过对阵列进行混洗并取第一个t来随机选择Map<Trial, Integer> challenge = new EnumMap<Trial, Integer>(Trial.class); int t = 4 + random.nextInt(5); // collect all Trial values in a list List<Trial> allTrials = Arrays.asList(Trial.values()); // shuffle that list Collections.shuffle(allTrials); // select the number of trials we want, add them to challenge for (int i = 0; i < t; ++i) { challenge.put(allTrials.get(i), random.nextInt(100) + 25); } // example output: {DRIVE=121, WEAPONS=119, STRATEGY=59, HACKING=78, STEALTH=72} System.out.println(challenge); 。我们将它们放在地图中,并附有相关值。

    ArrayList<Actor> myActor = new ArrayList<Actor>();
    ArrayList<Actor> anotherActor = new ArrayList<Actor>();
    // fill array with my actors
    Table firstTable = new Table();
    for (int i = 0; i < 7; i++) {
    firstTable.add(myActor.get(i));
    myActor.get(i).addListener(new ActorGestureListener() {
        public void touchDown(InputEvent event, float x, float y, int pointer, int button) {
            // draw arrow that follows finger
            }

        public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
            // if event finished and was on a cell from the
            // second table get starting actor and finishing actor
            // else nothing happens
            }
   });
  }
  Table secondTable = new Table();
  for (int i = 0; i < 7; i++) {
  secondTable.add(anotherActor.get(i));
  }

答案 2 :(得分:0)

  

但是我仍然需要随机选择它们(4-8)。

你可以使用

    Random r = new Random();
    int min = 4;
    int max = 8;

    System.out.println(r.nextInt((max - min) + 1) + min);