在java中,(int)(Math.random())和Math.random()之间的区别是什么?
(Math.random())前面的(int)到底对它做了什么?我知道这和从Math.random()中得到一个整数有关,但我真的不明白它是怎么做到的。我不明白这个(int)是怎么工作的。我的意思是,例如,我如何以其他方式使用它?Math.random()的签名是在java中,(int)(Math.random())和Math.random()之间的区别是什么?,java,Java,(Math.random())前面的(int)到底对它做了什么?我知道这和从Math.random()中得到一个整数有关,但我真的不明白它是怎么做到的。我不明白这个(int)是怎么工作的。我的意思是,例如,我如何以其他方式使用它?Math.random()的签名是public static double random()意思是它返回一个double值 如果出于某种原因需要整数,则应将该值转换为int。 为了简洁起见,它会在双精度曲线的点部分后剪切任何数字 e、 g.1.2将变成1 2.45将变成
public static double random()
意思是它返回一个double
值
如果出于某种原因需要整数,则应将该值转换为int
。
为了简洁起见,它会在双精度曲线的点部分后剪切任何数字
e、 g.1.2
将变成1
2.45
将变成2
等
另外,你应该认真阅读铸造的相关知识,了解如何以及何时使用铸造
编辑:
像@FlorentBayle一样,double()
生成的数字将始终返回0
,因为它的范围是[0,1)
0
包括在内,也就是说1
排除。因此,您必须将它与int
相乘,该值等于所需范围的最大值:
e、 g.要使int
进入范围[0,5)
,应使用:
int i = (int) (Math.random()*5);
Math.random()
的签名是publicstaticdouble random()
意味着它返回一个double
值
如果出于某种原因需要整数,则应将该值转换为int
。
为了简洁起见,它会在双精度曲线的点部分后剪切任何数字
e、 g.1.2
将变成1
2.45
将变成2
等
另外,你应该认真阅读铸造的相关知识,了解如何以及何时使用铸造
编辑:
像@FlorentBayle一样,double()
生成的数字将始终返回0
,因为它的范围是[0,1)
0
包括在内,也就是说1
排除。因此,您必须将它与int
相乘,该值等于所需范围的最大值:
e、 g.要使int
进入范围[0,5)
,应使用:
int i = (int) (Math.random()*5);
(int)将Math.random()的双重结果强制转换为整数。
因此(int)Math.random()始终为零,因为random()返回的数字大于或等于0.0,小于1.0
int i = (int)Math.random();
double d = Math.random();
System.out.println(i);
System.out.println(d);
如果需要整数随机数,则首先需要将随机数的结果进行多重化
int factor = 100;
i = (int)(Math.random() * factor);
System.out.println(i);
(int)将Math.random()的双重结果强制转换为整数。
因此(int)Math.random()始终为零,因为random()返回的数字大于或等于0.0,小于1.0
int i = (int)Math.random();
double d = Math.random();
System.out.println(i);
System.out.println(d);
如果需要整数随机数,则首先需要将随机数的结果进行多重化
int factor = 100;
i = (int)(Math.random() * factor);
System.out.println(i);
此语法是一种强制转换。它是在类型之间直接转换的一种方式;最常见的用例是,当您知道特定实例确实是某一子类型时,将特定类型的值转换为特定子类型,例如:
abstract class Parent {...}
class Child extends Parent {...}
Parent myObject = ... //we know it's *really* a Child
Child myObject2 = (Child) myObject;
请注意,这是一个不安全的操作:如果myObject
实际上是Parent
的不同子类,它将在运行时失败(通过抛出ClassCastException
)。因此,通常应避免强制转换。虽然编译器可能会拒绝编译某些可证明错误的强制转换,但大多数情况下,您可以重写类型系统,将任何内容强制转换为任何内容,失败只会发生在运行时
基元类型之间的强制转换是特殊情况的,而且更安全(尽管我仍然建议尽可能避免它们,因为它们看起来像不安全的代码;Double.valueOf(Math.random())。intValue()
以明显安全的方式获得相同的结果,而性能成本虽然真实,但与大多数程序无关)。请参阅JLS的第5.1.3节。此语法是一种强制转换。它是一种在类型之间直接转换的方法;最常见的用例是当您知道特定实例确实是某个子类型时,将特定类型的值转换为特定子类型,例如:
abstract class Parent {...}
class Child extends Parent {...}
Parent myObject = ... //we know it's *really* a Child
Child myObject2 = (Child) myObject;
请注意,这是一个不安全的操作:如果myObject
实际上是Parent
的不同子类,它将在运行时失败(通过抛出ClassCastException
)。因此,通常应避免强制转换。虽然编译器可能会拒绝编译某些可证明错误的强制转换,但大多数情况下,您可以重写类型系统,将任何内容强制转换为任何内容,失败只会发生在运行时
基元类型之间的强制转换是特殊情况的,而且更安全(尽管我仍然建议尽可能避免它们,因为它们看起来像不安全的代码;Double.valueOf(Math.random())。intValue()
以明显安全的方式获得相同的结果,而性能成本虽然真实,但与大多数程序无关)。请参阅JLS的第5.1.3节。Math.Random()只是java.util.Random()的包装
因此,相反,做一个
Random rnd = new java.util.Random(); //costly operation so use only once
rnd.nextInt(); //keep using nextwhatever for further operations
Random()只是java.util.Random()的包装器
因此,相反,做一个
Random rnd = new java.util.Random(); //costly operation so use only once
rnd.nextInt(); //keep using nextwhatever for further operations
关于施法你知道些什么?了解它。那是答案隐藏的地方。好的,我会的!谢谢!你知道关于施法的什么?了解它。那是答案隐藏的地方。好的,我会的!谢谢!标量值的施法与对象引用的施法完全不同。两者都是完全“安全的”。标量值的强制转换与对象引用的强制转换完全不同。两者都是完全“安全”的。因此,将标量值强制转换为
int
将始终返回0
,因此,将标量值强制转换为int
将始终返回0
。