【问题标题】:Generating a number between 1 and 2 java Math.random() with a probability set for each number生成 1 到 2 之间的数字 java Math.random() 并为每个数字设置一个概率
【发布时间】:2020-04-10 09:48:09
【问题描述】:

我正在尝试使用导入的 math.random() 类在 1 和 2 之间生成一个 random numbers,并为每个数字设置 probability

下面的代码将probability 设置为1/2,两个数字各为1/2

int randomInt = (Math.random() <= 0.5) ? 1 : 2;

我希望能够为每个单独的数字设置probability,例如数字 1(20% 概率)和数字 2(80% 概率)或 20:80 的比率。有什么解决办法吗?

编辑:我需要制作的程序能够为数字 1 和数字 2 分别设置 probability。比如让user 输入probability 的数字 1 和 2

【问题讨论】:

  • 你到底卡在哪里了?看来您理解逻辑了,只需将 0.5 替换为不同的分数即可。
  • rand() &lt;= 0.2 ? 1 : 2 工作吗?
  • 我的意思是有没有办法控制这两种概率,int randomInt = (Math.random()

标签: java math random probability


【解决方案1】:

我认为你可以在很多方面做到这一点。

选项 1:最简单

int randomInt = (Math.random() <= 0.2) ? 1 : 2;

选项 2:稍微有趣

// 20:80
final int seedList[] =  {
        1, //20%
        2,2,2,2//80%
};
for (int i =0; i < 10; i++) {
        int position = (int) (Math.random() * seedList.length);
        System.out.println(seedList[position]);
}

还有更多方法。我认为你可以创造性地解决这个问题。

【讨论】:

  • 我需要做的程序是能够分别设置数字1和数字2的概率。比如要求用户输入数字 1 和 2 的概率
【解决方案2】:

此方法将使用任意数量的数字作为加权结果。代码中没有检查,但为了正确起见,它们的总和应该是 100。

public static int randomInt(int... ratios) {
    int randomInt = ThreadLocalRandom.current().nextInt(1, 101);
    int previous = 0;
    for (int i = 0; i < ratios.length; i++) {
        if (randomInt < (ratios[i] + previous)) {
            return i + 1;
        }
        previous += ratios[i];
    }
    return 0;
}

例如,以下调用将给出 1 10%、2 40%、3 20% 和 4 30% 的概率。

randomInt(10, 40, 20, 30)

【讨论】:

  • 找不到符号比率。我需要开新课吗?
  • 不,这是一个静态方法。 ratios 是参数
【解决方案3】:

由于您的选择集仅包含两个项目 (1,2),因此您可以在用户输入 2 的概率时推断出 1 的概率。

public class OneOrTwo {
  public double probability1 = 0.2;
  public int next() {
    return (Math.random() <= probability1 ? 1 : 2);
  }
  public void setProbabilityOne(double p1) {
    probability1 = p1;
  }
  public void setProbabilityTwo(double p2) {
    probability1 = 1.0 - p2;
  }
  ... driver method, get user input, all that stuff ...
}

【讨论】:

    【解决方案4】:

    您需要做的就是在您的代码中参数化“0.5”。例如,为它使用一个变量:

    static int randomOneOrTwo(double probabilityOfOne) {
        return (Math.random() < probabilityOfOne) ? 1 : 2;
    }
    

    现在randomOneOrTwo(0.20) 将以 20% 的概率返回 1,以 80% 的概率返回 2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 2013-07-29
      • 1970-01-01
      相关资源
      最近更新 更多