【问题标题】:How to Generate Random Number Based on Probability in JavaJava中如何根据概率生成随机数
【发布时间】:2016-10-21 19:13:53
【问题描述】:

我想在 10% 的时间随机选择“1”,在 30% 的时间选择“2”,在另外 60% 的时间随机选择“3”。我想知道是否有一种方法可以让我根据 Java 中的这些概率进行随机抽样。

谢谢

【问题讨论】:

  • “基于概率的随机数” --- 这不就是随机数吗(无需太专业化)?
  • 你可以生成一个1到100之间的随机数,那么如果结果是1-10返回1,如果结果在10-40之间返回2,如果结果大于40返回3.
  • 使用数组{ 1, 2, 2, 2, 3, 3, 3, 3, 3, 3 }或列表,随机选择一个
  • Java 中的随机 Int 生成器随机选择一个 int,范围内的每个整数都有相等的被选中概率。我想将被选中的概率更改为 10%、30% 和 60%。我知道在 R 中有一个函数可以做到这一点。但我在 Java 中找不到。我正在询问是否有人知道一种方法。
  • 按照上面说的做,用1到100之间的随机数来决定选择哪一个。

标签: java sampling


【解决方案1】:

首先生成一个均匀分布在 0.0 和 1.0 之间的双精度数。然后将范围 (0.0

  • 0.0
  • 0.1
  • 0.4

在代码中:

double rand = rng.nextDouble();
if (rand < .1) {
  return 1;
} else if (rand < .1 + .3) {
  return 2;
} else {
  return 3;
}

(其中rngjava.util.Random 的一个实例。)

这种方法可以很容易地推广到任意一组目标概率。

【讨论】:

  • 您的意思是 .3 表示 “30% 的时间”,计算值为 .1 + .3 = .4,留下 .6 范围至 1.0最后“60% 的时间”
【解决方案2】:

这种方法适用于所有语言。只需获取一个大的随机数,然后取一些数字的 mod,并检查范围。

Random rand = new Random();
int r = rand.nextInt(10000000);
int m = r % 10;
if (m < 1) return 1; // 10 %
else if (m < 4) return 2; // 30 %
else return 3; // 60 %

【讨论】:

    【解决方案3】:

    Java API 的标准中没有方法。您可以编写自己的算法,您可以尝试使用 MockNeat.probabilities() 方法,该方法完全按照您的要求进行。

    例如:

    String s = mockNeat.probabilites(String.class)
                    .add(0.1, "A") // 10% chance to pick "A"
                    .add(0.2, "B") // 20% chance to pick "B"
                    .add(0.5, "C") // 50% chance to pick "C"
                    .add(0.2, "D") // 20% chance to pick "D"
                    .val();
    

    免责声明:我是该库的作者,所以我在推荐它时可能会有偏见。

    【讨论】:

      【解决方案4】:

      我认为没有办法,您只需要执行如下解决方法

      从 1-10 生成一个随机数,然后根据随机机会的概率选择 1,2 或 3。

      if (random_number == 1)
      {
        result = 1;
      }
      else if (random_number <= 4)
      {
        result = 2;
      }
      else
      {
      result = 3;
      }
      

      【讨论】:

      • 有一个方法。 nextDouble 将返回一个介于 0 和 1.0 之间的均匀分布的数字。然后,您可以使用它来进行选择。
      猜你喜欢
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 2016-01-26
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      相关资源
      最近更新 更多