0

是因为溢出吗?但据我了解,Math.random() 给出的数字小于 1,结果应该小于 0xFFFFFFFF。

4

4 回答 4

4

0xFFFFFFFF二进制补码是-1十进制。

你是对的,Math.random()返回一个介于0和之间的数字1。现在假设它是0.5. 然后你有:

(int) (0.5 * -1)这是(int)(-0.5)什么0时候投射到int.

假设您想使用最大的正数,请使用:

(int) (Math.random() * 0x7FFFFFFF)
                         ^ 

甚至更好

(int) (Math.random() * Integer.MAX_VALUE)
于 2013-07-03T13:27:40.050 回答
3

0xFFFFFFFF-1。因此,您乘以-1介于0.01.0(1.0不包括) 之间的值(根据 java 文档Math.random())。乘法将导致-1.0(不包括)和之间的值0.0。当您将其转换为int最终结果时, a0因为十进制值丢失了。

于 2013-07-03T13:26:24.980 回答
1
0xFFFFFFFF = -1
Math.random() takes a value from [0, 1] interval

您正在将一个小于的数字1与 a相乘-1。结果是相同的数字,但带有负号。将其转换为int将丢弃小数部分,剩下0.

于 2013-07-03T13:27:34.063 回答
-1

Math.Random 返回 0.0 到 >1.0 形式的双精度数。因此,如果您将其转换为 int,您将拥有 0. 0 * number = 0

于 2013-07-03T13:27:12.483 回答