java 正负随机_如何产生一个随机的[0, n)范围内的Short值

本文介绍了在Java编程中如何正确生成一个[0, n)范围内的正Short值,分析了使用Random.nextInt(n)可能产生负值的原因,并提供了两种解决方案:确保n不超过Short.MAX_VALUE或通过位操作屏蔽掉最高位。" 81903300,5517719,使用ThinkPHP5.0集成支付宝手机网站支付教程,"['后端开发', '支付接口', 'PHP', '支付宝集成', 'ThinkPHP']
摘要由CSDN通过智能技术生成

背景

最近在做一个Java的随机对象生成器。需要随机产生一些在[0, n)范围内的short值。

很多人可能会说,这有什么难的,我刚学编程的时候就会了。然后给出下面代码。

short value = (short) (new Random().nextInt(n));

看起来很棒的一段的代码,感觉完全没有问题,但是在实际测试过程中我们发现最后获取到的value值有时候会是负值。咦,怎么回事呢,nextInt(n)返回的不是[0, n)的值吗?

爬坑

为了解释以上问题,我们首先需要回顾下学校学的数值的表示。原码用第一位表示正负,后面的位数表示符号,正数反码,补码与原码都相同,负数除符号位外取反获得反码,反码加一获得补码。

int型在Java中占四个字节,short型在Java中占两个字节,int到short的强转将int的后两个字节截取,比如原本是0x0FFFFFFF,我们知道这是正数,但是如果截断获取后两个字节就编程了0xFFFF,这就是一个负数了。

那么判断一下如果是负数,取反行不行:

short value = (short) (new Random().nextInt(n));

value = (short)(value < 0 ? -value : value);

答案是不行,因为在Java中四则运算的最小类型是int型,short型和byte型的四则运算都是先将值转为Int型在进行的。所以value(0xFFFF -> 0x0000FFFF) < 0, NO. 即使这里取了负值,但是在经过又一次short强转之后又回到了原来的结果。

解决

那么如何解决这一问题呢,下面给出两种正确的解决代码。

n = n < Short.MAX_VALUE ? n : Short.MAX_VALUE;

short value = (short) (new Random().nextInt(n));

因为产生的int值在short值的范围内,所以即使强转也不会改变正负性。因为最大值是0x00007FFF,强转为short,最高位总是0;

short value = (short) (new Random().nextInt(n)) & 0x7FFF;

做位操作,只取产生值的后15位。第16位总是0,所以可以保证是正数。

当然只有在n > Short.MAX_VALUE的情况下才会有问题,如果本省n <= Short.MAX_VALUE,那么也不会有问题。byte与short同理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值