java - 根据百分比机会获取项目java

标签 java algorithm

我有一个对象列表,每个对象都包含一个百分比。

我想根据百分比抓取一个随机对象。

示例:

public class Item {
    private int chance;

    /* ... */
}

public class App {
    private List<Item> items;

    /* ... */

    public getItem() {
        // Get random item based on it's percentage
    }
}

我看过很多关于体重的帖子,但在这种情况下我需要百分比。

谢谢! :P

最佳答案

算法步骤为:
1 - 机会总和
2 - 根据机会多次存储一个项目
3 - 生成一个最大到 sum_Chances 的数字并返回索引(即对象)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Percent
{
    List<Item> l;
    Map<Integer,Item> m;
    public static void main(String[] args)
    {
        Percent p = new Percent();

        for(int i=0;i<=9;i++)
        {
            System.out.println(i+"_itemNo="+p.getItem().name);
        }

    }
    Percent()
    {
        l = new ArrayList();
        l.add(new Item("i1",1));
        l.add(new Item("i2",2));
        l.add(new Item("i3",3));
    }

    public Item getItem()
    {
        m = new HashMap();
        int total=0;
        int k=0;
        for(int i=0;i<l.size();i++)
        {

            total += l.get(i).chance;
            for(int j=0;j<l.get(i).chance;j++)
            {
                m.put(k,l.get(i));
                k++;
            }
        }
        int r = (int)(Math.random()*total);
        //System.out.println(r);
        return m.get(r);
    }
    class Item
    {
        Item(){};
        Item(String name, int chance)
        {
            this.name = name;
            this.chance = chance;
        }
        public int chance;
        public String name;
    }
}

输出:

0_itemNo=i3
1_itemNo=i3
2_itemNo=i3
3_itemNo=i3
4_itemNo=i1
5_itemNo=i2
6_itemNo=i1
7_itemNo=i2
8_itemNo=i2
9_itemNo=i3


即使有 10 个事件,也很容易看出 item_3 出现次数最多

关于java - 根据百分比机会获取项目java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61962988/

相关文章:

java - javascript 中的重定向到 JSP 不起作用(使用 Spring MVC)

java - Webview AppCache 不加载源非 html 内容

algorithm - 通过使用 Select 算法中的枢轴重复出现

algorithm - O(N) 与 O(NlogN)

algorithm - 如何创建从 3 个数字到 3 个完全不同的数字(基数 10)的一对一映射?

c - 查找不超过给定值 n 的素数的优化方法

java - 为什么迭代列表给我 stackoverflow 错误?

java - AES 128 解密中的预期 IV 长度 0 错误

java - GSON : Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

java:如何模拟 Calendar.getInstance()?