我很想知道,如何在Java中实现概率?例如,如果变量显示的可能性是1/25,那么我该如何实现呢?或任何其他概率?请指出我的总体方向。
答案 0 :(得分:59)
您可以使用Random生成随机数,然后针对文字进行测试,以匹配您尝试实现的概率。
所以给出:
boolean val = new Random().nextInt(25)==0;
val
将有1/25的概率为真(因为nextInt()
具有从0开始返回任意数字的均匀概率,直到但不包括25。)
你当然也必须import java.util.Random;
。
如下所述,如果您获得多个随机数,则重用Random对象而不是一直重新创建它会更有效:
Random rand = new Random();
boolean val = rand.nextInt(25)==0;
...
boolean val2 = rand.nextInt(25)==0;
答案 1 :(得分:29)
通常使用随机数生成器。大多数人在区间[0,1]中返回一个数字,因此您可以检查该数字是否为< = 0.04。
if( new Random().nextDouble() <= 0.04 ) { //you might want to cache the Random instance
//we hit the 1/25 ( 4% ) case.
}
或
if( Math.random() <= 0.04 ) {
//we hit the 1/25 ( 4% ) case.
}
请注意,有多个随机数生成器具有不同的属性,但对于简单的应用程序,Random
类应该足够了。
答案 2 :(得分:5)
Java有一个名为java.util.Random
的类,它可以生成随机数。如果您希望以1/25的概率发生某些事情,只需生成1到25之间(或0到24之间)的随机数,并检查该数字是否等于1.
if(new java.util.Random().nextInt(25)==0){
//Do something.
}
答案 3 :(得分:5)
从1.7开始,它的使用效果更好(至少在并发环境中):
ThreadLocalRandom.current().nextInt(25) == 0
与当前线程隔离的随机数生成器。与Math类使用的全局Random生成器一样,ThreadLocalRandom使用内部生成的种子进行初始化,否则可能无法修改。适用时,在并发程序中使用ThreadLocalRandom而不是共享Random对象通常会遇到更少的开销和争用。当多个任务(例如,每个ForkJoinTask)在线程池中并行使用随机数时,使用ThreadLocalRandom是特别合适的。 此类的用法通常应为以下形式:ThreadLocalRandom.current()。nextX(...)(其中X为Int,Long等)。当所有用法都是这种形式时,永远不可能在多个线程中意外地共享ThreadLocalRandom。
该类还提供了其他常用的有界随机生成方法。
答案 4 :(得分:3)
也许你可以通过生成随机数来实现这一点。
Random rn = new Random();
double d = rn.nextDouble(); // random value in range 0.0 - 1.0
if(d<=0.04){
doSomeThing();
}