首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中如何生成基于概率的随机数

Java中如何生成基于概率的随机数
EN

Stack Overflow用户
提问于 2016-10-22 03:13:54
回答 4查看 7.4K关注 0票数 3

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

谢谢

EN

回答 4

Stack Overflow用户

发布于 2016-10-22 03:22:47

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

  • 0.0 <= x< 0.1变为1(区间宽度为(0.1 - 0.0) = 0.1,或10%);
  • 0.1 <= x< 0.4变为2(区间宽度为(0.4 - 0.1) = 0.3,或30%);
  • 0.4 <= x< 1.0变为3(区间宽度为(1.0 - 0.4) = 0.6,或60%)。

在代码中:

代码语言:javascript
复制
double rand = rng.nextDouble();
if (rand < .1) {
  return 1;
} else if (rand < .1 + .3) {
  return 2;
} else {
  return 3;
}

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

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

票数 8
EN

Stack Overflow用户

发布于 2016-10-22 03:20:29

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

代码语言:javascript
复制
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 %
票数 1
EN

Stack Overflow用户

发布于 2018-09-12 20:22:55

Java API的标准中没有任何方法。你可以编写你自己的算法,你可以尝试使用MockNeat.probabilities()方法,它完全按照你的要求来做。

例如:

代码语言:javascript
复制
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();

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40183948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档