在Java中随机获得价值和机会百分比

如何解决在Java中随机获得价值和机会百分比

我希望能够根据每个项目的预定义机会百分比来返回(在我们的示例中,显示一个枚举项目。该枚举的代码如下:

package me.lucas.test;

public enum Item {

    ITEM_1("Item 1",30),ITEM_2("Item 2",ITEM_3("Item 3",10),ITEM_4("Item 4",65);

    private final String name;
    private final int percentage;

    Item(String name,int percentage) {
        this.name = name;
        this.percentage = percentage;
    }

    public String getName() {
        return name;
    }

    public int getPercentage() {
        return percentage;
    }

}

此外,这些项目将存储在列表中。

package me.lucas.test;

import java.util.ArrayList;
import java.util.List;

public class Program {

    private final List<Item> items = new ArrayList<>();

    /**
     * displays an item among those in the list,according to their percentage chance of appearing.
     * @param items The items
     */
    public void displayItem(List<Item> items) {
        Item item;

        item = ?

        System.out.println("Selected item : " + item.getName() + " with percentage : " + item.getPercentage());
    }

}

就是说,如本例所示,两个项目出现的几率相同。

我还研究了以下主题Java Random Percentage Chance),但就我而言,百分比不是直接在表达式中预定义的,而是在枚举中预定义的。

因此,感谢您的帮助。预先感谢您抽出宝贵的时间来帮助我。

解决方法

从视觉上讲,您实现了机会之轮

轮子将落在1到100的任意位置上。现在您只需要读出,可能在此位置上。如果总和 100,则此位置可能有多个项目。

Whheel of Chacne

所有百分比从1到100换行-通过取模实现。您生成的随机数在1到100之间,或者在这种情况下在0到99之间(请参见Random的Javadoc)。

在代码中,它可能如下所示:

public class RandomExample<T extends Object> {
    List<Item> items = new LinkedList<>();
    Random rand = new Random();
    
    public void addItem(int percentage,T object) {
        items.add(new Item(percentage,object));
    }
    
    public List<Item> getRandom() {
        List<Item> result = new ArrayList<>();
        int hit = rand.nextInt(100);
        items.forEach(i -> {
            if(i.isHit(hit)) {
                result.add(i);
            }
        });
        return result;
    }
    
    public class Item {
        private int percentage;
        private T object;
        private int hitLow;
        private int hitHigh;
        
        public Item(int percentage,T object) {
            this.percentage = percentage;
            this.object = object;
            int sum = 0;
            for(Item i : items) {
                sum+=i.getPercentage();
            }
            hitLow = sum % 100;
            hitHigh = (sum+percentage) % 100;
        }
        
        public int getPercentage() {
            return percentage;
        }
        
        public T getObject() {
            return object;
        }
        
        public boolean isHit(int hitVal) {
            boolean isHit = hitLow == hitHigh; //exactly 100%
            isHit |= hitLow <= hitVal && hitHigh >= hitVal;
            return isHit;
        }
    }

}

方法RandomExample.Item.isHit(int)仍需要一个额外的条件才能正确处理机会,该机会大约为100(例如hitLow = 90hitHigh = 10)。但是您了解了这个概念,应该能够将其适应您的需求。

您需要问自己的另一个问题是:如果某人的百分比超过100,会发生什么。我的直觉是您应该抛出异常。但这是您决定和实施的。

,

要简单!

  1. 创建一个数组。
  2. 将所有项目放入此数组,#nav-container{ padding-top: 0px; padding-left: 0px; padding-right: 0px; padding-bottom: 0px; } #header{ padding: 1%; } #header-container{ padding: 0px; margin: 0px; } 进行计数。
  3. 随机排列数组。
  4. 从此数组中检索随机元素。

percentage

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?