我有一个关于选择具有指定稀有性的物品的问题。
我有一个“卡”类
class Card {
String name;
int seltenheit;
ArrayList<String> lore;
String full_id;
int id_int;
byte id_byte;
Card(String name, int seltenheit, ArrayList<String> lore, String id) {
this.name = name;
this.lore = lore;
this.full_id = id;
this.id_int = (id.contains(":")) ? Integer.parseInt(id.substring(0, id.indexOf(":")))
: Integer.parseInt(id);
this.id_byte = (id.contains(":"))
? Byte.parseByte(id.substring(id.indexOf(":") + 1, id.length()))
: 0;
this.seltenheit = seltenheit;
}
}
并且我创建了一个包含一些卡的ArrayList,并且每个卡在该类中都有其自己的“稀有性”,因为我来自奥地利,所以被称为“ Seltenheit”。
我想从此ArrayList中以指定的稀有度选择5个项目。 稀有度介于1到100之间,100表示非常普遍,1表示非常罕见,依此类推。所以我需要一个函数,它会随机选择5个稀有项。
对不起,我的英语不好:P 我希望有人能帮助我。 谢谢。
答案 0 :(得分:0)
从ArrayList中选择所有具有选定稀有度的卡到单独的集合中。
从单独的收藏集中选择五张随机卡片。
如果需要,这种通用方法也适用于具有一定稀有度值的卡。
您需要处理少于五张稀有卡片的情况。您可能想让单独的收藏夹保留卡片的引用,而不是复制整个卡片。
答案 1 :(得分:0)
可能是一个老问题:Randomly selecting an element from a weighted list
答案是将所有稀有物加在一起,然后放入二叉搜索树中。
您只需要根据随机(1,sum_of_rarity)选择一个节点即可。
(有关其他说明,请参见其他答案)
答案 2 :(得分:0)
您还可以执行以下操作:
由于混洗,复杂度为O(n)
(source),其中n
是具有特殊稀有性的纸牌数量。这可能是O(log n)
if use a tree structure或类似名称。这将需要与列表不同的结构,而列表可能不是您想要的。但是,如果复杂性不是问题(也许是因为没有多少张具有特定稀有性的卡片),那么这段代码将简短易行:
public ArrayList<Card> selectRandomItems(ArrayList<Card> cards, int rarity, int maxItems) {
// Get all cards with the given rarity
ArrayList<Card> selected = cards.stream()
.filter(card -> card.seltenheit == rarity)
.collect(Collectors.toCollection(ArrayList::new));
// Shuffle the collection to get random items
Collections.shuffle(selected);
// Get the maximum index without going out of bounds, given the maximum amount of items
int maxIndex = (selected.size() < maxItems) ? selected.size(): maxItems;
return new ArrayList<>(selected.subList(0, maxIndex));
}