在Java中生成短的随机数?

16

我想生成一个短整型的随机数,就像有一个名为 Random.nextInt(134116) 的整型函数一样。我该如何实现呢?


你需要负数吗? - luketorjussen
不,我不需要负数,只需要从0到最大的short值。 - waqas
5个回答

25

没有Random.nextShort()方法,因此你可以使用

short s = (short) Random.nextInt(Short.MAX_VALUE + 1);

加一是因为该方法返回的数字是在指定的数字范围内(不包括指定数字本身)。请参见此处

这将生成从0到Short.MAX_VALUE(包括Short.MAX_VALUE)之间的数字(OP没有要求负数)。


各位,如果我想要像Random.nextInt(23456)一样设置一个限制,以便生成0-23456之间的任何数字,那么如何使用短输入实现呢? - waqas
@Waqas,如果你想返回一个short类型的值,无论你设置什么限制,你都必须进行强制转换。限制只是告诉随机数生成器你想要返回的整数的最大值。 - luketorjussen
random.nextInt() 会产生一个均匀分布在 Integer.MIN_VALUEInteger.MAX_VALUE 之间的整数,也就是说,小于0的值和大于0的值数量大致相等。另一方面,提出的解决方案 Random.nextInt(Short.MAX_VALUE + 1) 只会产生大于0的值,不会有小于0的值。 - mwengler
@mwengler - 请查看问题的评论 - “你需要负数吗?”“不,卢克,我只需要从0到最大短整型。” - luketorjussen
2
@luketorjussen 好的,我明白发生了什么。在这里遵循了一种惯例,将方法称为.nextInteger(int top),而不是.nextInteger()。但是,没有参数的Random.nextInteger()会生成正数和负数,而Random.nextInteger(top)只会生成正数。我认为对于以后阅读此内容的其他人来说,保留这个明确的信息是有价值的。 - mwengler
显示剩余5条评论

14

能够生成所有可能的短值且最有效的解决方案是执行以下操作之一。

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();

11

Java的short类型包含在-32 768到+32 767的区间内。

为什么不执行一个

Random.nextInt(65536) - 32768

将结果强制转换为short类型的变量?


5
我猜想并写下这句话是为了让你延长键盘的使用寿命。 - Skippy Fastol

6

那么short s = (short) Random.nextInt();如何?请注意,结果的分布可能存在偏差。Java语言规范保证这不会导致异常,int将被截断以适应short。

编辑

实际进行快速测试,结果分布似乎也是均匀分布的。


如果生成的数字大于short所能容纳的范围会怎么样? - luketorjussen
只有最后四位将被保留,但不会产生溢出。 - assylias
但是它会改变生成的随机数的精细均匀性吗? - Skippy Fastol
所有的最低16位都是等可能的。在转换之后,偏差不会比之前更大。 - Peter Lawrey

3

只需生成一个整数,如:

 short s = (short)Random.nextInt(Short.MAX_VALUE);

生成的int将在short的值空间中,因此可以进行强制转换而不会丢失数据。

这将生成非负的short值,但不包括Short.MAX_VALUE。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接