如何增加 Java 中 random() 的某个数字的概率?

How to increase propability of a certain number for random() in Java?

首先,我目前使用的在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%)。

有什么办法可以解决这个问题吗?

谢谢。

使用 java.util.Random 而不是 Math.random。它有更好的功能,如 random.nextInt().

为了增加概率,使用 Zabuzard 的评论建议的方法

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 个 'special' 数字之一,70% 的时间,我们选择最小-最大范围内的数字之一。

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

一种方法是扩展随机 selected 的范围,在您的情况下为 1-45,以包括 (factor-1)*numbers.length 附加值,其中您希望数组中的数字为 factor 倍的可能性。然后你 select 来自这个扩展范围的随机数。小于45直接使用,大于45则计算数组中对应的位置

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

这里有一些代码来说明:

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对应的图: