一个范围内的多个加权随机数

时间:2013-12-17 02:51:59

标签: java random

我目前正在尝试使用静态数字在java中编辑以下代码以显示范围内的数字(此代码显示了块中某个点的距离,我需要使其难以找到块) :

int R = getBlockTypeDistance(event.getClickedBlock().getLocation(), stid);
if (R == -1){
    player.sendMessage(ChatColor.BLUE + plugin.getConfig().getString("text.very_cold"));
} else if(R < 12) {
    player.sendMessage(ChatColor.RED + plugin.getConfig().getString("text.very_hot"));
} else if(R < 18){
    player.sendMessage(ChatColor.RED + plugin.getConfig().getString("text.hot"));
} else if(R < 27){
    player.sendMessage(ChatColor.GOLD + plugin.getConfig().getString("text.warm"));
}

我正在为其他if语句寻找随机生成的数字,其中包含以下范围:

而不是R&lt; 12,范围在0到15之间

而不是R&lt; 18,范围在15和22之间

而不是R&lt; 27,范围在22和30之间

所有范围都应该具有“重量”(在该范围内获得高于75%的数字的概率为90%)

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

对于非加权的情况,你可以去random.nextInt(max-min+1) + min;并定义一个错误来检查我的数学!

加权是什么意思?

事实证明0.9 ^ 13非常接近0.25(如果我的数学是正确的 - 请仔细检查!)。因此,如果你在0-1.0的范围内随机取得一个随机数,那么在90%的时间里,你的数字会小于0.25。投入1-x使其在90%的时间内大于0.75。

答案 1 :(得分:0)

这是我能想到的一种方式。观察评论,看看其他人是否有更好的想法或改进,但这是我提出的:

    private static int generateNumber(int min, int max)
    {
        Random rnd =  new Random();
        int randomInt;

        int weightedMin = (int)Math.round((max - min) * .75) + min; //Create a minimum number that is 75% of the way through the range

        //Generate a random number between 1 - 100
        //If that number is between 0 and 90 then generate the top end
        if ((rnd.nextInt(101) + 1) <= 90) randomInt = rnd.nextInt((max - weightedMin) + 1) + weightedMin; 
        else randomInt = rnd.nextInt((max - min) + 1) + min;

        return randomInt;
    }

基本上它所做的是生成1到100之间的随机数。如果该数字介于1和90之间,则表示它处于90%概率范围内,生成75%+范围。否则它会产生75% - 。这有意义吗?