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



我目前正在尝试用静态数字编辑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<12,范围在0到15之间

代替R<18,范围在15到22之间

代替R<27,范围在22到30之间

所有范围都应该有一个"权重"(90%的机会得到高于范围75%的数字)

感谢任何帮助,谢谢。

以下是我可以考虑的一种方法。查看评论,看看其他人是否有更好的想法或改进,但这就是我想到的:

    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之间(包括1和90),则表示它在90%的概率范围内,生成75%+范围。否则,它将生成75%-。这有道理吗?

对于非加权的情况,你可以去random.nextInt(max-min+1) + min;,并明确地检查我的数学是否有一个错误!

你说的加权是什么意思?

结果是0.9^13非常接近0.25(如果我的数学是正确的,请仔细检查!)。因此,如果你在0-1.0的范围内随机抽取一个数字,并将其提升到13次方,你会在90%的时间内得到小于0.25的数字。加入1-x,使其在90%的时间内大于0.75。

最新更新