如何解决在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,则此位置可能有多个项目。
所有百分比从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 = 90
和hitHigh = 10
)。但是您了解了这个概念,应该能够将其适应您的需求。
您需要问自己的另一个问题是:如果某人的百分比超过100,会发生什么。我的直觉是您应该抛出异常。但这是您决定和实施的。
,要简单!
- 创建一个数组。
- 将所有项目放入此数组,
#nav-container{ padding-top: 0px; padding-left: 0px; padding-right: 0px; padding-bottom: 0px; } #header{ padding: 1%; } #header-container{ padding: 0px; margin: 0px; }
进行计数。 - 随机排列数组。
- 从此数组中检索随机元素。
percentage
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。