【问题标题】:Math.random() explanationMath.random() 解释
【发布时间】:2011-11-01 02:11:10
【问题描述】:

这是一个非常简单的 Java(尽管可能适用于所有编程)问题:

Math.random() 返回一个介于 0 和 1 之间的数字。

如果我想返回一个介于 0 和 00 之间的整数,我会这样做:

(int) Math.floor(Math.random() * 101)

在一到一百之间,我会这样做:

(int) Math.ceil(Math.random() * 100)

但是如果我想得到一个介于 3 和 5 之间的数字怎么办?会不会像下面的语句:

(int) Math.random() * 5 + 3

我在java.lang.util.Random 中知道nextInt()。但我想通过Math.random() 学习如何做到这一点。

【问题讨论】:

  • 对于 [3,5]:(int)Math.floor(Math.random()*3) + 3
  • 顺便说一句:范围是从 0.0(含)到 1.0(你永远不会得到 1.0)使用 nextInt() 是一个更好的选择,不仅更简单而且更快。
  • 使用Math.ceil是错误的,当Math.random()返回0时会给出错误的结果。
  • 如果 Math.floor 返回 0.029 会怎样?如何始终通过单个语句获得两位数?

标签: java math


【解决方案1】:
int randomWithRange(int min, int max)
{
   int range = (max - min) + 1;     
   return (int)(Math.random() * range) + min;
}

randomWithRange(2, 5) 10 次的输出:

5
2
3
3
2
4
4
4
5
4

边界是包含的,即[2,5],并且在上面的例子中min必须小于max

编辑:如果有人想装傻并反转minmax,您可以将代码更改为:

int randomWithRange(int min, int max)
{
   int range = Math.abs(max - min) + 1;     
   return (int)(Math.random() * range) + (min <= max ? min : max);
}

EDIT2:关于doubles 的问题,只是:

double randomWithRange(double min, double max)
{
   double range = (max - min);     
   return (Math.random() * range) + min;
}

再一次,如果您想防白痴,那就是:

double randomWithRange(double min, double max)
{
   double range = Math.abs(max - min);     
   return (Math.random() * range) + (min <= max ? min : max);
}

【讨论】:

  • 如果您不使用(int) 并希望它返回double 怎么办?
  • 如果你想要双倍,那么只需将 ints 替换为 doubles (并且不需要类型转换)。我以为你想要ints,但我会添加到我的帖子中。
  • 实际上用doubles 删除+ 1 也是因为Math.random() 没有被截断。但是,范围将是 [min, max),因为Math.random“返回一个带正号的双精度值,大于或等于 0.0 且小于 1.0。”即使有可能,这个数字恰好是max 的可能性也很小。
【解决方案2】:

如果你想生成一个从 0 到 100 的数字,那么你的代码应该是这样的:

(int)(Math.random() * 101);

要生成一个从 10 到 20 的数字:

(int)(Math.random() * 11 + 10);

一般情况下:

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);

(其中lowerbound 包含,upperbound 不包含)。

包含或排除upperbound 取决于您的选择。 假设range = (upperbound - lowerbound) + 1 那么upperbound 是包容性的,但如果range = (upperbound - lowerbound) 那么upperbound 是排斥性的。

示例:如果我想要一个介于 3-5 之间的整数,那么如果 range 为 (5-3)+1 则 5 包含在内,但如果 range 仅为 (5-3) 则 5 不包含。

【讨论】:

  • upperbound 独家?我认为它将是包容性的。
  • @vidit 独家
  • 不要以为你已经掌握了大局 上限也可以,如示例中提供的那样
【解决方案3】:

位于java.util 包中的Java 的Random 类将更好地满足您的目的。它有一些返回整数的nextInt() 方法。采用 int 参数的那个将生成一个介于 0 和该 int 之间的数字,后者不包括在内。

【讨论】:

  • 我更新了我的问题,我想知道如何使用Math.random()。谢谢。
【解决方案4】:

要生成一个介于 10 到 20 之间的数字,可以使用 java.util.Random

int myNumber = new Random().nextInt(11) + 10

【讨论】:

    【解决方案5】:

    这是一个接收边界并返回随机整数的方法。它稍微高级一点(完全通用):边界可以正负两种,最小/最大边界可以按任意顺序排列。

    int myRand(int i_from, int i_to) {
      return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
    }
    

    一般来说,它会找到边界之间的绝对距离,获取相关的随机值,然后根据底部边界移动答案。

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 2016-03-24
      • 1970-01-01
      • 2015-09-24
      • 2014-09-10
      • 2017-12-04
      • 2011-07-31
      • 2011-05-04
      • 1970-01-01
      相关资源
      最近更新 更多