正如标题所解释的那样,我希望生成一系列随机短值。因为没有Random.nextShort()函数,所以做我想要的最简单方法似乎是将整数转换为short,使用:
Random rand = new Random(int seed);
(short) rand.nextInt()
但是,我并不完全理解这种投射是如何发生的,因此我无法确定所得的短值是否仍然是随机的。是这样的吗?提前谢谢。
答案 0 :(得分:4)
int的短转换通过按位截断工作。只要整数是随机分布的,短值也应该是 - 是的。
来自Java语言规范5.1.3:
将有符号整数缩小转换为整数类型T. 简单地丢弃除n个最低位之外的所有位,其中n是数字 用于表示类型T的位数。
int
有32位,short
有16位。本质上,转换与添加(或减去)65536(对于16的幂为2)相同,直到该值在范围内可由short
表示。因此,正好有65536 int
个值映射到每个可能的short
值。
答案 1 :(得分:3)
规范的方法是short result = (short)(rand.nextInt(Short.MAX_VALUE-Short.MIN_VALUE+1) + Short.MIN_VALUE)
。这样做的原因是您需要一个范围跨越Short.MAX_VALUE-Short.MIN_VALUE+1
值的数字,并从Short.MIN_VALUE
开始。
简单截断可能足够short
(如果速度对您很重要,它可能也更快),但这种方法适用于任何范围。
假设您想要-5
和12
之间的随机数(包括两者),您将调用rand.nextInt(12-(-5)+1)+(-5)
,或者如果您简化所有计算:{ {1}}。
答案 2 :(得分:1)
避免错误的好方法是:
Random rand = new Random(int seed);
short s = (short) rand.nextInt(Short.MAX_VALUE + 1);
如果你还需要负面的短片:
short s = (short) rand.nextInt(Short.MAX_VALUE - Short.MIN_VALUE + 1) + Short.MIN_VALUE;
最快的解决方案:
short s = (short) random.nextInt(1 << 16); // any short
short s = (short) random.nextInt(1 << 15); // any non-negative short
答案 3 :(得分:-1)
该数字仍然是随机的,但您可能会遇到此号码的最大/最小值不同的问题,有关详细信息,请在此处查看第一个答案here
答案 4 :(得分:-1)
我认为这不起作用,因为int
比short
大很多。
只需随机float
或double
(值介于[-1; 1]之间)并将它们乘以短的最大值:
short i= (short) rand.nextFloat() * Short.MAX_VALUE;