如何增加 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
对应的图:
首先,我目前使用的在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
对应的图: