为什么?我以为“ +1”是它可以生成的最低数字...这是问题:
“(int)Math.random()*(65535 +1)返回以下之间的随机数: 在0到65535之间。<-答案
这是来自sololearn挑战的问题。
答案 0 :(得分:0)
方法Math.random()
的文档说:
返回带正号的大于等于0.0且小于1.0的双精度值。
很明显-从数学上讲,生成的间隔为<0, 1)
。这意味着,生成的数字将永远不会达到1.0,但最大数量会低于此数字(例如0.99
)。由于您将其乘以65535
,因此它将永远不会达到65535
。这就是为什么您必须添加+1
。
我建议您使用类Random
及其方法nextInt(int bound)
,它可以:
返回一个伪随机数,其int值在0(含)和指定值(不含)之间均匀分布
因此:
Random random = new Random();
int integer = random.nextInt(65536); // 65535 + 1 because the number is exclusive
答案 1 :(得分:0)
为什么?我以为“ +1”是它可以产生的最低数字...
这是因为+1
被放在括号内。见下文:
(int) Math.random()*(65535 + 1) //is equivalent to
(int) Math.random()*(65536) //which is equivalent to
(int) 0.0 to number < 1.0 *(65536) //which gives you a range of..
(int) (0 * 65536) to (0.999.. * 65536) //which gives you..
(int) 0 to 65535.34464.. //converted to int gives you
0 to 65535
如果您希望最小随机数至少为1。在 之后添加它即可:
(int) (Math.random()*65535) + 1
答案 2 :(得分:0)
您现在拥有代码的方式:
(int) Math.random()*(65535 + 1)
您将始终获得0
。
Math.random()
method生成范围为[0,1)的数字。
返回一个带有正号的
double
值,该值大于或等于0.0
但小于1.0
。
将该数字乘以n
时,其范围为[0,n)。将其强制转换为int
会截断该数字的任何小数部分,使该数字成为0
,并且任何与0乘以0的值都是0。首先进行强制转换,因为它是一个higher precedence而不是乘法。>
让我们加上括号,以便在乘法之后进行强制转换。
(int) (Math.random()*(65535 + 1))
将截断的数字乘以n
时,其范围为[0,n)。乘法运算将整数舍去后,将其强制转换为int
,从而使整数的范围从0到(n-1)。
如果在乘法和强制转换之后添加1
,则它可以生成的最低数字将是1
。添加之前的范围是0到65534,添加之后的范围是1到65535。
(int) (Math.random()*65535) + 1