将随机整数转换成短的均匀分布?

时间:2016-06-20 12:13:37

标签: java random casting int short

正如标题所解释的那样,我希望生成一系列随机短值。因为没有Random.nextShort()函数,所以做我想要的最简单方法似乎是将整数转换为short,使用:

Random rand = new Random(int seed);
(short) rand.nextInt()

但是,我并不完全理解这种投射是如何发生的,因此我无法确定所得的短值是否仍然是随机的。是这样的吗?提前谢谢。

5 个答案:

答案 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 (如果速度对您很重要,它可能也更快),但这种方法适用于任何范围。

假设您想要-512之间的随机数(包括两者),您将调用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)

我认为这不起作用,因为intshort大很多。

只需随机floatdouble(值介于[-1; 1]之间)并将它们乘以短的最大值:

short i= (short) rand.nextFloat() * Short.MAX_VALUE;