有人可以解释为什么(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 ...?
答案 0 :(得分:3)
第一个可以返回-3
,这是非常不可能的。
返回带正号的大于等于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) someNumber
是someNumber
的情况下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的值少得多。