【问题标题】:Pick item based on percentage根据百分比选择项目
【发布时间】:2015-07-23 07:21:20
【问题描述】:

我正在创建一个插件,我正在努力弄清楚如何使用HashMap 根据他们的百分比来挑选获胜者。

在我的插件中,每个玩家都存入一件物品,然后根据物品的价值,他们会收到一定百分比的返还。我正在尝试根据概率选择获胜者。现在有多个用户正在存款,这意味着该数字可能是Double

有什么方法可以计算出来吗?

package com.test;

import java.text.DecimalFormat;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;

public class Main {

static HashMap<String, Double> JackpotEntrys = new HashMap<String, Double>();
static HashMap<String, Double> JackpotPCE = new HashMap<String, Double>();
static HashMap<String, Double> Stage1JPE = new HashMap<String, Double>();

public static void main(String[] args) {

    JackpotEntrys.put("mrgreen33gamer", 155.000);
    JackpotEntrys.put("XeneonHD", 270.000);
    JackpotEntrys.put("BadBoyBaldSpot", 760.000);
    JackpotEntrys.put("Kingcreeper6", 455.000);
    JackpotEntrys.put("Kingcreeper5", 50.000);
    JackpotEntrys.put("Kingcreeper4", 100.000);
    JackpotEntrys.put("Kingcreeper3", 20.000);
    JackpotEntrys.put("Kingcreeper2", 15.000);
    JackpotEntrys.put("Kingcreeper1", 5.000);

    Set<String> PCES1 = JackpotEntrys.keySet();
    for (Iterator<String> i = PCES1.iterator(); i.hasNext(); ){
        String key = (String) i.next();
        Double value = (Double) JackpotEntrys.get(key);



    }

    JPValue();
    PCE_JPE_Pick();

}

public static void JPValue(){
    Collection<Double> values = JackpotEntrys.values();

    int Total = 0;
    for (Double value : values) {
        Total += value;
    }
    System.out.println("Jackpot was totalled at: " + Total);
}

public static void PCE_JPE_Pick(){

    System.out.println("========== NEW LINE ==============");

    Set<String> PCES1 = JackpotEntrys.keySet();
    for (Iterator<String> i = PCES1.iterator(); i.hasNext(); ){
        String key = (String) i.next();
        Double value = (Double) JackpotEntrys.get(key);


        double finalPE = value / 1000;

        JackpotPCE.put(key, finalPE);
    }

    Set<String> PCES2 = JackpotPCE.keySet();
    for(Iterator<String> i2 = PCES2.iterator(); i2.hasNext(); ){
        String key = (String) i2.next();
        Double value = (Double) JackpotPCE.get(key);
        System.out.println(key + " has a probability of DOUBLE: " + value);
    }

    Random r = new Random();
    double randomValue = 0 + (1 - 0) * r.nextDouble();

    System.out.println(randomValue);

}

public static double probabilityCal(double PlayerDepot) {

    Collection<Double> values = JackpotEntrys.values();
    int Total = 0;
    for (Double value : values) {
        Total += value;
    }

    double percentage = (double) ((PlayerDepot * 100) / Total);
    DecimalFormat df = new DecimalFormat("#.###");
    double finalPercentage = Double.parseDouble(df.format(percentage));
    return finalPercentage;
}
}

另外一件事:如果我想挑选一个各占 33% 的获胜者,我会如何挑选那个球员?

【问题讨论】:

  • 你的任务不清楚。尝试更好的描述。

标签: java probability


【解决方案1】:

如果您正在寻找算法,我可以提供帮助。假设您有三个百分比值 25%、25% 和 50%。您需要做的是将这些转换为 0 到 1 之间的连续范围,因此第一个变为 0 到 0.25 的范围,第二个变为 0.25 到 0.5 的范围,第三个变为 0.5 到 1 的范围。生成一个介于 0 和1,无论您的随机数落在哪个范围内,都是赢家。

【讨论】:

  • 嘿伙计,我照你说的做了,但是我将如何生成一个非常低的双精度值:Kingcreeper1 的概率为 DOUBLE:0.005
  • 我的 Java 不太好,但据我所知,Random 类中的双生成器非常精确
  • 老兄。假设我有 3 名球员的百分比为 33%,换算成小数点,0.33。我将如何选择获胜者?我的意思是如果人们有 0.005。我怎么知道那个人赢了?我要从那个值中减去所有值吗?
  • 我的想法是为每个玩家分配一个范围,包括最大值和最小值。因此,要生成范围,请遍历所有玩家。从第一个最小值为 0 和第一个最大值为 0.33 开始,然后循环遍历其余的玩家。当前玩家最小值将是之前的最大值,当前最大值将是当前最小值加上百分比,在本例中为 0.33。重复。那有意义吗?这种情况下的范围将是 (0,.33) (.33,.66) (.66, 1.0) 您可以将最后一个范围设为 max = 1,因为它的差异可以忽略不计。
  • 您有 Skype 或 Gmail 吗?我们可以随便聊聊。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 2012-06-23
  • 2011-08-01
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多