【问题标题】:Probability in JavaJava中的概率
【发布时间】:2012-01-01 07:13:12
【问题描述】:

我很想知道,如何在 Java 中实现概率?例如,如果变量显示的机会是 1/25,那么我将如何实现呢?还是其他概率?请指点我大致的方向。

【问题讨论】:

  • 查看 java Random 类。这允许你生成随机数,你可以从那里开始......

标签: java probability


【解决方案1】:

您可以使用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:将new Random() 放在字段或变量中并重用它会提高效率。
  • @PeterLawrey 你当然是正确的,我已经适当地编辑了答案。我只是把它作为一个 1 行示例!
【解决方案2】:

通常您使用随机数生成器。其中大多数返回区间 [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 类应该就足够了。

【讨论】:

  • 在一般情况下,这个使用 rand.nextDouble() 的解决方案比公认的答案更好,因为它可以应用于任意概率(而不仅仅是给定整数 x 的 1/x) .例如,如果您的目标概率是 33.5%,则没有使用 rand.nextInt() 的简单、干净的解决方案。
  • @shiri 取决于潜在的精度问题。使用整数,您可以创建一个介于 0 和 1000 之间的整数并检查该值是否低于 335。
  • 同意,我想这归结为偏好问题。当我想到概率时,我倾向于用 [0,1] 范围内的数字来思考,所以我发现 nextDouble()
  • 鉴于 == 由于精度而在浮点数中具有误导性,使用
  • @Hilikus 对于较小的值,精度对于== 来说已经足够了,但您可以按照自己的喜好进行操作。是否包含边界应该不会有很大的不同。
【解决方案3】:

从 1.7 开始最好使用(至少在并发环境中):

ThreadLocalRandom.current().nextInt(25) == 0

Javadoc

与当前线程隔离的随机数生成器。与 Math 类使用的全局 Random 生成器一样,ThreadLocalRandom 使用内部生成的种子进行初始化,否则该种子可能不会被修改。如果适用,在并发程序中使用 ThreadLocalRandom 而不是共享 Random 对象通常会遇到更少的开销和争用。当多个任务(例如,每个 ForkJoinTask)在线程池中并行使用随机数时,使用 ThreadLocalRandom 尤其合适。 此类的用法通常应采用以下形式:ThreadLocalRandom.current().nextX(...)(其中 X 是 Int、Long 等)。当所有用法都采用这种形式时,绝不可能在多个线程之间意外共享 ThreadLocalRandom。

该类还提供了其他常用的有界随机生成方法。

【讨论】:

    【解决方案4】:

    Java 有一个名为java.util.Random 的类,它可以生成随机数。如果您希望某事以 1/25 的概率发生,只需生成一个介于 1 和 25(或 0 和 24 包括在内)之间的随机数并检查该数字是否等于 1。

    if(new java.util.Random().nextInt(25)==0){
        //Do something.
    }
    

    【讨论】:

      【解决方案5】:

      也许您可以通过生成随机数来实现这一点。

        Random rn = new Random();
          double d = rn.nextDouble();     // random value in range 0.0 - 1.0
          if(d<=0.04){
          doSomeThing();
          }
      

      【讨论】:

        猜你喜欢
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多