【问题标题】:How to calculate a drop rate based on percentage如何根据百分比计算掉率
【发布时间】:2014-04-03 11:13:13
【问题描述】:

我在发帖和math.stackexchange.com 之间犹豫不决,但选择了这里,因为它同样与编程相关,而且我之前没有使用过math.stackexchange.com

基本上,我有 6 个不同的项目我想根据百分比“删除”,但我不知道如何实施。数学也不是我的强项,这也无济于事。

无论如何,第 1 到第 6 项的百分比如下:

1%, 0.85%, 0.1%, 0.05%, 0.01%, 0.001%

所以物品 1 有 1% 的几率掉落,物品 2 有 0.85% 的几率掉落等等。

而且我希望每次运行都会掉落 1 个项目,如果没有满足这些“机会”,那么将使用默认项目。考虑这 6 项奖励项目。

到目前为止,我已经尝试过:

        Random rn = new Random();

    int x = rn.nextInt(100)+1;

    if(100%x==0)//1%
    {

    }
    if(100%(x*100)==0) //0.1%
    {

    }

这似乎不是一个公平的计算,而这个:

    Random rn = new Random();

    int x = rn.nextInt(100000)+1;

    if(100%x==0)//1%
    {

    }
    if(8500%x==0) //0.1%
    {

    }

这似乎更糟。

我想为每个项目使用一个随机数,但RNG 很多,因为它将在游戏循环中运行。

我尽量让这个问题保持直接,以避免争论等,所以我不是在寻找 最佳 解决方案,只是一个可行的解决方案 - 如果需要任何其他信息,我只要能帮我解决这个问题,我很乐意回答 =)

【问题讨论】:

标签: java math


【解决方案1】:

为每个机会生成随机数是个好方法:

    double[] chances = {1, 35, 0.85, 50, 0.1, 0.05, 0.01, 0.001, 65, 11};
    Random r = new Random();
    boolean dropped = false;
    for (int i = 0; i < chances.length; i++) {
        if (chances[i] > r.nextDouble() * 100) {
            System.out.println("Item with " + chances[i] + " chance is dropped");
            dropped = true;
            break;
        }
    }
    if (dropped == false) {
        System.out.println("Dropping default item");
    }

请注意,只要您只删除一项,元素的顺序就很重要。

例如,您有 5 件商品下降了 99%。从逻辑上讲,第五件物品掉落的几率只有 (0.01^4)*0.99。

【讨论】:

  • 感谢您的实施示例
  • @Timmy - 不客气,我又添加了一个解决方案 + 您应该考虑的重要注意事项 :)
【解决方案2】:

我会生成一个介于 0 和 1 之间的随机双精度数,并使用范围:

  • 介于 0 和 0.01 (1%) 之间:物品 1 掉落
  • 介于 0.01 和 0.0185 (1% + 0.85%) 之间:物品 2 掉落
  • 介于 0.0185 和 0.0195 (1.85% + 0.1%) 之间:物品 3 滴
  • ...

【讨论】:

  • 感谢您提供的伪示例,在阅读@libik 的答案之前,我无法完全理解它,但现在一切都说得通了——谢谢。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多