【发布时间】:2012-01-01 07:13:12
【问题描述】:
我很想知道,如何在 Java 中实现概率?例如,如果变量显示的机会是 1/25,那么我将如何实现呢?还是其他概率?请指点我大致的方向。
【问题讨论】:
-
查看 java Random 类。这允许你生成随机数,你可以从那里开始......
标签: java probability
我很想知道,如何在 Java 中实现概率?例如,如果变量显示的机会是 1/25,那么我将如何实现呢?还是其他概率?请指点我大致的方向。
【问题讨论】:
标签: java probability
您可以使用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;
【讨论】:
new Random() 放在字段或变量中并重用它会提高效率。
通常您使用随机数生成器。其中大多数返回区间 [0,1] 中的数字,因此您将检查该数字是否
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 类应该就足够了。
【讨论】:
== 来说已经足够了,但您可以按照自己的喜好进行操作。是否包含边界应该不会有很大的不同。
从 1.7 开始最好使用(至少在并发环境中):
ThreadLocalRandom.current().nextInt(25) == 0
与当前线程隔离的随机数生成器。与 Math 类使用的全局 Random 生成器一样,ThreadLocalRandom 使用内部生成的种子进行初始化,否则该种子可能不会被修改。如果适用,在并发程序中使用 ThreadLocalRandom 而不是共享 Random 对象通常会遇到更少的开销和争用。当多个任务(例如,每个 ForkJoinTask)在线程池中并行使用随机数时,使用 ThreadLocalRandom 尤其合适。 此类的用法通常应采用以下形式:ThreadLocalRandom.current().nextX(...)(其中 X 是 Int、Long 等)。当所有用法都采用这种形式时,绝不可能在多个线程之间意外共享 ThreadLocalRandom。
该类还提供了其他常用的有界随机生成方法。
【讨论】:
Java 有一个名为java.util.Random 的类,它可以生成随机数。如果您希望某事以 1/25 的概率发生,只需生成一个介于 1 和 25(或 0 和 24 包括在内)之间的随机数并检查该数字是否等于 1。
if(new java.util.Random().nextInt(25)==0){
//Do something.
}
【讨论】:
也许您可以通过生成随机数来实现这一点。
Random rn = new Random();
double d = rn.nextDouble(); // random value in range 0.0 - 1.0
if(d<=0.04){
doSomeThing();
}
【讨论】: