首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用给定数量的属性生成给定数量的随机对象?

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

Stack Overflow用户
提问于 2017-04-08 19:51:21
回答 3查看 526关注 0票数 4

我的问题是,如何产生一个随机的挑战,一个给定的数目(4-8)的审判?

挑战是从试验中构建的(参见下面的代码)。

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

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

代码语言:javascript
运行
复制
Weapons = 25;
Hacking = 32;
Vehicle = 34;
Speed = 56;

因此,对于一个挑战,我不需要所有的考验,只是其中的一部分。但我仍然需要随机选择的可能性(4-8)。

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

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

到目前为止,守则:

代码语言:javascript
运行
复制
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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-08 20:13:12

比方说,您想要在t试用中产生一个挑战,其中int t = random.nextInt(5) + 4,比如4 <= t <= 8 (请注意,nextInt的界限是排他的)。如果我正确地阅读了您的代码,那么每一次试验都会得到random.nextInt(100) + 25的相关值(所以在25到124之间)。

你可以这样做如下。我们创建一个包含所有试验的数组,并通过对数组进行洗牌并获取第一个t,从其中随机选择t。我们把它们放在地图上,有一个相关的值。

代码语言:javascript
运行
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2017-04-08 19:59:17

如果我没看错你的问题,你是在问:如何随机挑选其中的一个?

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

代码语言:javascript
运行
复制
Trial allTrials[] = Trial.values();
Random random = new Random();

Trial pickRandomTrial() {
  return allTrials[random.nextInt(allTrials.length)];
}
票数 2
EN

Stack Overflow用户

发布于 2017-04-08 19:56:52

但我仍然需要从他们随机选择(4-8)的可能性。

您可以使用

代码语言:javascript
运行
复制
    Random r = new Random();
    int min = 4;
    int max = 8;

    System.out.println(r.nextInt((max - min) + 1) + min);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43299692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档