我想生成一个短整型的随机数,就像有一个名为 Random.nextInt(134116) 的整型函数一样。我该如何实现呢?
没有Random.nextShort()
方法,因此你可以使用
short s = (short) Random.nextInt(Short.MAX_VALUE + 1);
加一是因为该方法返回的数字是在指定的数字范围内(不包括指定数字本身)。请参见此处
这将生成从0到Short.MAX_VALUE(包括Short.MAX_VALUE)之间的数字(OP没有要求负数)。
random.nextInt()
会产生一个均匀分布在 Integer.MIN_VALUE
到 Integer.MAX_VALUE
之间的整数,也就是说,小于0的值和大于0的值数量大致相等。另一方面,提出的解决方案 Random.nextInt(Short.MAX_VALUE + 1)
只会产生大于0的值,不会有小于0的值。 - mwengler能够生成所有可能的短值且最有效的解决方案是执行以下操作之一。
short s = (short) random.nextInt(1 << 16); // any short
short s = (short) random.nextInt(1 << 15); // any non-negative short
甚至更快
class MyRandom extends Random {
public short nextShort() {
return (short) next(16); // give me just 16 bits.
}
public short nextNonNegativeShort() {
return (short) next(15); // give me just 15 bits.
}
}
short s = myRandom.nextShort();
Java的short类型包含在-32 768到+32 767的区间内。
为什么不执行一个
Random.nextInt(65536) - 32768
将结果强制转换为short类型的变量?
那么short s = (short) Random.nextInt();
如何?请注意,结果的分布可能存在偏差。Java语言规范保证这不会导致异常,int将被截断以适应short。
编辑
实际进行快速测试,结果分布似乎也是均匀分布的。
只需生成一个整数,如:
short s = (short)Random.nextInt(Short.MAX_VALUE);
int
将在short
的值空间中,因此可以进行强制转换而不会丢失数据。