Math.random()如何在Java中完美地工作?

时间:2017-12-15 13:21:56

标签: java

我最近遇到了

  

Math.random()

Java中的

类。 (而且)我想知道这堂课。例如,我试图编写一个需要从1到6的随机数的骰子游戏" roll"。这就是math.random()的用武之地。这行代码:

int random_num = (int) (Math.random() * 6) + 1;

CAN生成1到6之间的随机数。

我的问题在于

(Math.random() * 6)

这里。

我知道这段代码是如何工作的,Math.random()如何生成介于0.0到1.0之间的double值。它是如何乘以6的,最后是四舍五入的。

然而,我很困惑为什么一个随机数(比如说0.78396954122)乘以6可能会变成1到6之间的随机数。据说随机数0.78396954122乘以6,总是6,对吧? 2.78396954122无法突然弹出!

我是Java的一个完整的菜鸟,如果你能帮忙解释一下,我将不胜感激。

先谢谢...

3 个答案:

答案 0 :(得分:6)

  然而,我很困惑为什么一个随机数(比如0.78396954122)乘以6可以成为1到6之间的随机数。据说随机数0.78396954122乘以6,总是6,对吗?

没有。 0.78396954122 * 6是4.70381724732,当被(int)截断时变为4,当+ 1完成时变为5。

同样,Math.random可能会返回0.2481654,当乘以6时为1.4889924,(int)截断为1,然后由于+ 1而变为2。

如果是0.0485847 * 6,则为0.2915082,(int)截断为0,由于+ 1而变为1。

将返回的最低值Math.random为0.0,由(int)截断为0。 0 * 6为0,在+ 1之后变为1。将返回的最高值Math.random是0.99999999(等)(例如,它将是< 1)。乘以6得到5.999999(等),被(int)截断为5,然后由+ 1变为6。

这就是我们如何从该代码中获得范围1-6。

答案 1 :(得分:1)

<强>的Math.random()

它生成一个介于0.0到1.0之间的随机数(总是小于1.0)。所以,在您的问题中,您说要在1 to 6之间生成随机数,这就是为什么您将它乘以6,这样函数将返回的任何随机数将乘以6然后+ 1,这样它总是保持在1-6之间。

就像你说的那样,0.78396954122 * 6是6那么你的计算错了,

0.78396954122 * 6是4.7,(int)将四舍五入为4。这在java中称为强制转换,最后它将变为4 + 1 = 5

这就是为什么你得到一个介于1-6之间的数字

答案 2 :(得分:0)

这是一个简单的数学运算:

  • Math.rand()在区间[0,1 [,根据定义
  • ]中生成一个浮点数,比如说x
  • x乘以6会使其位于区间[0,6 [
  • 将其转换为int是截断(几乎保留原始数字的整数部分),因此该值为0,1,2,3,4或5
  • 然后添加一个给出1,2,3,4,5或6。
  

Math.random()如何生成介于0.0到1.0之间的double值。

生成伪随机数是件棘手的事。 Java规范没有定义如何实现它,所以我们无法告诉你它是如何工作的。但是如果你想知道如何生成伪随机数,那么Wikipedia PRNG page

可能是一个很好的条目