随机整数函数

时间:2018-11-29 00:17:46

标签: java

有人可以解释为什么(int) (Math.random()*12-3)返回值介于-2和8之间而(int) (Math.random()*12)-3返回值介于-3和8之间吗?

不同之处在于括号的位置,但是我不知道它在其中产生不同的“内幕”原因。如果Math.random()可以返回的最小值是0,则0 * 12 = 0,并且两者都应以-3作为最小值。 我认为这与强制转换为int以及将0.x强制转换为1有关。仅仅是从理论上讲不可能达到0.00000000 ...?

4 个答案:

答案 0 :(得分:3)

第一个可以返回-3,这是非常不可能的。

Math.random()

  

返回带正号的大于等于0.0且小于1.0的双精度值。

因此,当(int) (Math.random()*12-3)在内圆括号内时,结果将是一个double,并将其强制转换为int。这会截断小数位,因此除非Math.random() * 12精确地返回 0(然后减去3以得到精确的-3),否则Math.random() * 12 -3将返回最低的{{ 1}},它将被截断为-2。

当您这样做:

2.{...}

强制转换比减法precedence大,因此被截断到(int) (Math.random()*12)-3 的可能性更大。然后减去三个,得到0

答案 1 :(得分:1)

这是由于操作顺序以及(int) someNumbersomeNumber的情况下double 截断 Math.random()所致。这意味着在第一种情况下,(int) -2.[...]返回零是极不可能的(但有可能),在这种情况下,表达式的计算结果为-3。但是,其他任何较小的值都会产生(int),该值变为-2,因为它被截断了(小数点被截断了)。

在另一种情况下,将Math.random()*12应用于Math.random()*12 < 1,然后从结果中减去3。在这里,任何时候0 - 3 = -3都会得到1/12作为结果。这种情况大约在include时发生,因此您会看到它经常产生-3。

答案 2 :(得分:0)

使用(int)强制转换为int会将浮点值截断为0。因此,对于(int) (Math.random()*12-3),即使我们得到-2.9999,(int) -2.9999 = -2。而如果我们计算(int) (Math.random()*12),则可以截断例如0.5到0,然后0-3 = -3。

答案 3 :(得分:0)

它们都可以达到-3。

Math.random()返回0(含)和1(不含)之间的double

强制转换为int会将值截断为接近0的值:(int)(-2.9) == -2(int)(2.9) == 2。有效地,它使负数“较大”而使正数“较小”。

区别在于(int) (Math.random()*12)-3仅计算Math.random()*12部分,然后转换为int-小于1/12的任何随机值在转换为int时将导致结果为0 ,然后减去3片叶子-3。

原始情况可能会导致-3,但只有在Math.random()提供的结果为0时,这种情况比提供小于1/12的值少得多。