为一个角色生成随机统计数据,其中较高的统计数据可能性较低

时间:2016-02-11 09:06:47

标签: java random

我正在寻找一种方法,我可以随机生成角色的统计数据(如技能,攻击,防御......)。 让我们说我的统计数据来自

  

1 - 100

现在我想要

之间的统计数据
  

1 - 30概率为30%

     

31 - 50概率为45%

     51-75概率为20%

     

76 - 100概率为5%

我知道我可以使用Math.random()课程或SELECT,但不确定如何。

提前致谢!

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

如果我们有如下列表:

{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));
}