Java,随机数和sololearn挑战

时间:2018-07-19 18:22:15

标签: java random

为什么?我以为“ +1”是它可以生成的最低数字...这是问题:

“(int)Math.random()*(65535 +1)返回以下之间的随机数: 在0到65535之间。<-答案

这是来自sololearn挑战的问题。

3 个答案:

答案 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