我一直试图找到一种方法来生成一个数字,它更有可能在一个范围的中间生成一个数字。鉴于:
rnum = r.nextInt(5) + 1;//+ 1 to exclude 0
生成 1 到 5 之间的完全随机数(如果+ 1
删除则为 0 和 4 )。我想要做的是生成更少的 1 和 5,并生成很多 3。我试过这个:
int[] classes = {1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5};
System.out.println("Class " + classes[r.nextInt(15)]);//logs the output
但它会生成这个:(打印语句重复 10 次)
Class 2
Class 3
Class 1
Class 4
Class 3
Class 4
Class 2
Class 3
Class 2
Class 5
然而,这既不是有效的方法,也不是一个好的方法。此外,由于用于检索数字的随机数生成器是完全随机的,而不是关注中心值,因此输出如上。3 只出现 30% 的时间,这太低了。2 出现的概率也为 30%,这意味着(在此测试中)它与 3 的生成概率相同。
那么,如何以更高的概率随机生成一个数字以在一个范围的中间生成一个数字?
最简单的方法是从包含所需概率的数组开始。
import java.util.Random;
class Main {
public static int getOneNumber(double[] probs, Random rnd) {
double r = rnd.nextDouble();
for (int j = 0; j < probs.length; j++) {
if (r < probs[j]) {
return j;
}
r -= probs[j];
}
throw new RuntimeException("probabilities should sum to 1");
}
public static void main(String[] args) {
// Desired probabilities
double[] probabilities = {
0.05, // 0
0.15, // 1
0.6, // 2
0.15, // 3
0.05 }; // 4
Random rnd = new Random();
for (int i = 0; i < 20; i++) {
System.out.println(getOneNumber(probabilities, rnd));
}
}
}
这里的想法如下。我们生成 0 到 1 之间的随机数。现在我们检查:它是否低于 0.05?如果是,我们返回 0——它发生的概率为 0.05。如果不是,我们检查我们的数字是否在 0.05 和 0.15 之间(通过从中减去 0.05 并与 0.1 进行比较)。如果是(这种情况发生的概率为 0.15-0.05 = 0.1)——我们得到 1。如果不是,我们检查随机数是否在 0.15 和 0.75 之间,等等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句