【问题标题】:How to increase propability of a certain number for random() in Java?如何在 Java 中增加 random() 某个数字的概率?
【发布时间】:2021-10-08 19:44:58
【问题描述】:

首先,我目前使用的取1-45范围内的随机数的方法是:

public int getRandomNumber(int min, int max) {
    return (int) ((Math.random() * (max - min)) + min);
}

我想做的是,假设一个int数组中有六个数字

int[] numbers = [2, 4, 6, 8, 10, 12];

我想增加从 1 ~ 45 范围内随机生成的数字中选择数组中数字的概率(大约 20% 到 30%)。

有没有办法解决这个问题?

谢谢。

【问题讨论】:

  • 你所说的“那个数字”是指哪个数字?
  • 实现它的一种方法:将范围分成numbers 数组和范围内其他数字的数组。然后首先执行nextDouble(),如果是< 0.3,则从numbers 中选择一个随机元素。如果是> 0.7,您可以选择其他任何号码。这样,从numbers 获得号码的几率为 30%。
  • @Zabuzard 你的方法很好,但是 0.3 太大了。即使将单个 p 提高 30%,半打值也不占概率的 30%。通过求解关系6*(1.3*p) + 39*p = 1 找到正确的比例,即应选择1/6 时间的子集和5/6 时间的其余部分。
  • @pjs 我假设选择一个特殊数字的概率应该是 30%。您假设概率应该比其他任何概率高 30%。我将把它作为练习留给读者去理解。

标签: java algorithm random probability


【解决方案1】:

使用 java.util.Random 代替 Math.random。它有更好的函数,比如 random.nextInt()。

为了增加概率,请使用 Zabuzard 的评论 How to increase propability of a certain number for random() in Java? 建议的方法

static final int[] numbers = new int[]{2, 4, 6, 8, 10, 12};

static final Random random = new Random();

public int getRandomNumber(int min, int max) {
    int p = random.nextInt(10);
    if (p < 3) {
        return numbers[random.nextInt(numbers.length)];
    } else {
        return min + random.nextInt(max - min);
    }
}

在这里,30% 的情况下,我们会选择 6 个“特殊”数字之一,而 70% 的情况下,我们会选择最小-最大范围内的数字之一。

我不确定这是否正是您想要的,但您可以调整比例,直到找到符合您需求的东西。

【讨论】:

    【解决方案2】:

    一种方法是扩展随机选择的范围,在您的情况下为 1-45,以包含 (factor-1)*numbers.length 附加值,您希望数组中的数字更有可能是 factor 倍。然后,您从这个扩展范围中选择随机数。如果值小于 45 直接使用,如果大于则计算数组中对应的位置。

    这种方法可以用于factor 的小数值,但代价是代码复杂性增加。如果这是一个问题,请在 cmets 中告诉我,我会提供编辑。

    这里有一些代码来说明:

    int min = 1;
    int max = 45;
    
    int range = 1 + max - min;
    
    int factor = 3;
    int[] numbers = {2, 4, 6, 8, 10, 12};
    
    int randomRange = range + (factor-1)*numbers.length;
    
    Random rand = new Random();
    
    int[] h = new int[max];
    
    for(int i=0; i<10000; i++)
    {
        int p = rand.nextInt(randomRange);
        
        if(p < range)
            p  += min;
        else
            p = numbers[(p-range)/(factor-1)];
                    
        h[p-min]++;
    }
    

    以及h的对应图:

    【讨论】:

    • factor 是非整数时,我认为您需要进行一些清理。该问题提出了 1.2 到 1.3 的系数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2023-03-13
    • 2012-12-17
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    相关资源
    最近更新 更多