如何在Java中从类中获取随机项?

如何在Java中从类中获取随机项?,java,class,random,Java,Class,Random,我刚刚开始学习Java,而且我还是个新手 我试图用Java创建一个非常简单的基于文本的RPG游戏 我创建了一个名为“敌人”的类。该类包含某些变量,例如表示敌人姓名的字符串、表示敌人健康和伤害的整数等。使用这个“敌人”类,我创建特定的敌人。例如,使用“敌人”类,我将创建一个僵尸敌人,并为上述变量指定某些值 我希望能够做的是随机遭遇敌人。例如,假设我有一个僵尸敌人、一个巨大的蜘蛛敌人和一个刺客敌人,每个敌人的值都分配给“敌人”类中的变量,我希望有一个随机的战斗遭遇。僵尸45%的时间出现,蜘蛛25%的

我刚刚开始学习Java,而且我还是个新手

我试图用Java创建一个非常简单的基于文本的RPG游戏

我创建了一个名为“敌人”的类。该类包含某些变量,例如表示敌人姓名的字符串、表示敌人健康和伤害的整数等。使用这个“敌人”类,我创建特定的敌人。例如,使用“敌人”类,我将创建一个僵尸敌人,并为上述变量指定某些值

我希望能够做的是随机遭遇敌人。例如,假设我有一个僵尸敌人、一个巨大的蜘蛛敌人和一个刺客敌人,每个敌人的值都分配给“敌人”类中的变量,我希望有一个随机的战斗遭遇。僵尸45%的时间出现,蜘蛛25%的时间出现,刺客30%的时间出现

我怎样才能做到这一点或类似的事情?可能有教程吗


抱歉,如果我说的不太有道理…

这将是实现以下目标的一般格式(如选择敌人的统一概率):

注:随机元素选择取自

针对不同的敌人选择概率 其思想是在0-1范围内创建一个随机
double
然后根据其中的不同范围,选择/创建敌人。在这种情况下,数组没有意义

double randVal = Math.random();
Enemy encounterEnemy;
if (randVal < 0.25){
    encounterEnemy = createZombie();
}else{
    encounterEnemy = createGiantSpider();
}
double randVal=Math.random();
敌人遭遇我;
如果(randVal<0.25){
遇到renemy=createZombie();
}否则{
EncountereName=createGiantSpider();
}

在这种情况下,有25%的概率会遇到僵尸,75%的概率会遇到巨型蜘蛛。

这将是实现以下目标的通用格式(如选择敌人的统一概率):

注:随机元素选择取自

针对不同的敌人选择概率 想法是在0-1范围内创建一个随机的
double
,然后根据该范围内的不同范围,选择/创建一个敌人。在这种情况下,数组没有意义

double randVal = Math.random();
Enemy encounterEnemy;
if (randVal < 0.25){
    encounterEnemy = createZombie();
}else{
    encounterEnemy = createGiantSpider();
}
double randVal=Math.random();
敌人遭遇我;
如果(randVal<0.25){
遇到renemy=createZombie();
}否则{
EncountereName=createGiantSpider();
}

在这种情况下,有25%的概率会遇到僵尸,有75%的概率会遇到巨型蜘蛛。

如果您将您的
敌人
实例放在一个列表中,并有一个单独的排序列表来存储概率,您可以执行以下操作来随机选择一个:

// in real code you would have to build this list and check it is sorted in reverse order
// and that the total sum is 100
List<Double> probabilities = Arrays.asList(45, 30, 25);
List<Enemy> enemies = Arrays.asList(new Zombie(), new Spider(), new Assassin());

public static Enemy randomEnemy(List<Enemy> enemies, List<Double> probabilities) {
    double d = Math.random();
    double threshold = 0;

    for (int i = 0; i < probabilities.size(); i++) {
        threshold += probabilities.get(i) / 100;
        if (d < threshold) return enemies.get(i);
    }
    throw new IllegalArgumentException("Probabilities don't add up to 1. Total: " + threshold);
}
//在实际代码中,您必须构建此列表并检查它是否按相反顺序排序
//总数是100
列表概率=数组.asList(45,30,25);
列出敌人=Arrays.asList(新僵尸(),新蜘蛛(),新刺客());
公共静态敌人随机敌人(列出敌人,列出概率){
double d=Math.random();
双阈值=0;
对于(int i=0;i
如果您将您的
敌人
实例放在一个列表中,并且有一个单独的排序列表来存储概率,您可以执行以下操作来随机选择一个:

// in real code you would have to build this list and check it is sorted in reverse order
// and that the total sum is 100
List<Double> probabilities = Arrays.asList(45, 30, 25);
List<Enemy> enemies = Arrays.asList(new Zombie(), new Spider(), new Assassin());

public static Enemy randomEnemy(List<Enemy> enemies, List<Double> probabilities) {
    double d = Math.random();
    double threshold = 0;

    for (int i = 0; i < probabilities.size(); i++) {
        threshold += probabilities.get(i) / 100;
        if (d < threshold) return enemies.get(i);
    }
    throw new IllegalArgumentException("Probabilities don't add up to 1. Total: " + threshold);
}
//在实际代码中,您必须构建此列表并检查它是否按相反顺序排序
//总数是100
列表概率=数组.asList(45,30,25);
列出敌人=Arrays.asList(新僵尸(),新蜘蛛(),新刺客());
公共静态敌人随机敌人(列出敌人,列出概率){
double d=Math.random();
双阈值=0;
对于(int i=0;i
你知道,代码是程序员的通用语言。比文字更好你到目前为止试过什么?你被困在哪里了?如上所述,在这种情况下,代码是必须的。你知道,代码是程序员的通用语言。比文字更好你到目前为止试过什么?你被困在哪里了?如上所述,在这种情况下,代码是必须的。这不符合能够有选择地选择每个结果的概率的要求。在你的情况下,所有的敌人都有相同的可能性变得更好,但仍然不足以完全通用。您只支持固定数量的敌人变体。任意数量的敌人如何?@Dici你提供了一个更好的通用解决方案。为了简单起见,我想避开创建方法之类的东西。如果我想让不同的敌人拥有不同的特定统计数据呢?例如,僵尸有50点生命值,掉落10金,而蜘蛛有30点生命值,掉落5金。我想我要问的是,我如何为数组中的项分配一些变量?顺便说一句,谢谢你的回答!:)@如果我想让不同的敌人拥有不同的特定属性,该怎么办?应在
createZombie
中处理僵尸的整个创建过程,包括其统计信息。这同样适用于
巨型蜘蛛
等等。这不符合能够有选择地选择每个结果的概率的要求。在你的情况下,所有的敌人都有相同的可能性变得更好,但仍然不足以完全通用。您只支持固定数量的敌人变体。任意数量的敌人如何?@Dici你提供了一个更好的通用解决方案。为了简单起见,我想避开创建方法之类的东西。如果我想让不同的敌人拥有不同的特定统计数据呢?例如,僵尸有50点生命值,掉落10点金子,而蜘蛛有30点重击