【问题标题】:Generate random stats for a character where high stats are less probable then low为角色生成随机统计信息,其中高统计信息的可能性较小然后低
【发布时间】:2016-05-21 23:14:14
【问题描述】:

我正在寻找一种可以随机生成角色统计数据的方法(例如技能、攻击、防御……)。 假设我的统计数据来自

1 - 100

现在我想要

1 - 30 的概率为 30%

31 - 50 的概率为 45%

51 - 75 的概率为 20%

76 - 100 的概率为 5%

我知道我可能可以使用Random 类或Math.random(),但不确定如何使用。

提前致谢!

【问题讨论】:

  • @JoCoaker 您是否打算以 45% 的概率生成 31-50?还是您想在 20% 的时间内生成这些值?
  • @TimBiegeleisen 好吧,我希望它的概率为 45%,但是在下面的构造中,我可以为随机生成器 etc(31 - 50) 设置新值,然后生成实际的价值:) 所以你的答案帮助我

标签: java random


【解决方案1】:

一种选择是生成一个 0 到 100 范围内的随机数,然后使用一系列 if-else 语句来确定要为您的角色生成哪些统计数据:

public void printRandomStats() {
    Random random = new Random();
    int next = random.nextInt(101);

    if (next <= 30) {
        // this will happen 30% of the time
        System.out.println("Generating stats from 1-30");
    } else if (next <= 75) {
        // this will happen 45% of the time
        System.out.println("Generating stats from 31-75");
    } else if (next <= 95) {
        // this will happen 20% of the time
        System.out.println("Generating stats from 76-95");
    } else {
        // this will happen 5% of the time
        System.out.println("Generating stats from 96-100");
    }

    return;
}

【讨论】:

    【解决方案2】:

    解决您的问题的最佳方法是创建一个非均匀概率值列表。然后从该列表中随机选择一个值。例如:

    如果我们有如下列表:

    {5 , 5 , 5 , 5 , 10 , 10 , 10 , 20, 20 ,30} 
    

    我们的概率是这样的;

    5 => 40%  ---  10 => 30%  ---  20 => 20%  ---  30 => 10%
    

    您可以通过以下简单方法实现该解决方案:

    private static int generateStat()
    {
    
        ArrayList<Integer> stats = new ArrayList<Integer>();
    
        //first parameter is probability and second is the value
        stats.addAll(Collections.nCopies(30, (int)(Math.random()*30))); 
        stats.addAll(Collections.nCopies(45, (int)(Math.random()*20)+30));
        stats.addAll(Collections.nCopies(20, (int)(Math.random()*25)+50));
        stats.addAll(Collections.nCopies(5,  (int)(Math.random()*25)+75));
    
        return stats.get((int)(Math.random()*100));
    }
    

    【讨论】:

    • 我有一个问题:是否也有小数概率?比如 4.5% 和 0.5% ?
    • 了解如何! (概率末尾加“0”,多玩1000)
    • @JoCoaker 是的,当然有可能。但它不像你说的那样。如果您在概率末尾添加“0”并将随机索引乘以 1000,您将得到完全相同的概率。您需要通过根据需要更改列表大小和内容来自定义概率。或第二种方式;如果您不需要像“游戏中的物品掉落率(物品箱可能为空)”那样满足 100% 的概率,您可以将随机索引乘以 1000 而不是 100,然后像您一样处理“IndexOutOfBoundException”(空结果)想要。
    • 嗯。我得到了第二种方式,但我不太应该明白你对第一种方式的意思。你会这么好心并在你的答案中添加一个例子吗? :)
    • @JoCoaker 例如在添加操作下添加第五行:stats.addAll(Collections.nCopies(900, -1));并像这样更改返回语句: return stats.get((int)(Math.random()*1000));现在,如果你得到'-1' 结果,这意味着“空”。而你的真实概率会减少 10 倍。
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多