背景

最近在做一个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同理。

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

  1. Java黑皮书课后题第3章:**3.4(随机月份)编写一个随机产生1和12之间整数的程序,并根据数组1,2,3...显示对应的月份

    **3.4(随机月份)编写一个随机产生1和12之间整数的程序,并根据数组1,2,3...显示对应的月份 题目 题目描述 破题 代码 如何理解产生随机数 题目 题目描述 **3.4(随机月份)编写一个随 ...

  2. mysql st_contains实现_查看某一个点是否在某个多边形内 使用ST_Contains函数

    查看某一个点是否在某个多边形内  使用ST_Contains函数 --LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.35 ...

  3. 暗黑再临Java增值版_暗黑破坏神-黑暗再临2.0巴尔归来【修改版】

    地 图 名:暗黑破坏神-黑暗再临2.0巴尔归来[修改版] 地图类型:魔兽防守地图 地图作者:Promise6522 修改作者:黑之月 地图语言:中文 支持人数:1-7 魔兽版本:1.24E 修改介绍: ...

  4. java同花顺判定_笔试题:随机抽取五张牌 判断是否为同花顺

    题目: 从一副扑克牌中随机抽取5张牌 判断这五张牌是否是一个同花顺 同花顺:点数连续 花色相同 大小王可以当做任意点数任意花色的牌 简单陈述一下思路 package cn.yangwanhao.wri ...

  5. 利用Java线程及JFrame面板制作一个随机摇号小程序

    很多都是自己写的,慢慢的尝试,里面改了很多次数 但是最后的结果是没有错的 最后的最后终于得到想要的结果 慢慢的训练总能得到训练的 加油!!!! 上代码: import java.awt.Color; ...

  6. 使用java中Scanner,Randon,ArrayList完成一个随机点名系统

    import java.util.*;public class Test01 {public static void main(String[] args) {//使用Arrays.asList创建一 ...

  7. android 随机播放代码,Android | 一个随机播放网络音乐的小 Demo

    前言 是这样,前几天接触到一个可以随机获取网络音乐及其热评的 API(关于该API:github.com/isecret/yun- ),于是乎就想着要做一个小 demo 来练练手吧! 目前的效果就是上 ...

  8. 如何建立java ssm工程_如何搭建一个ssm项目

    1.创建一个普通的maven项目,引入Spring MVC 的pom依赖 2.添加Spring的配置(xml方式applicationContext.xml)扫描除了controller包之外的包(扫 ...

  9. java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息

    Jstack 用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息. 这里需要注意的是 Java 8 引入了 Java Mission Control, ...

最新文章

  1. akaze特征匹配怎么去掉不合适的点_SIFT特征点
  2. engine中调整Element的上下显示顺序(遮盖)
  3. linux c 宏判断多条件 #ifdef 和 #if defined 的区别
  4. 【❌❌vectorの奇技淫巧⭕⭕】C++ vector 如何正确处理动态申请内存的元素
  5. 通过key登录ssh
  6. Javascript覆盖率(jstd)报表解析Maven插件
  7. SAP CRM的Genil层和Hybris的jalo模型
  8. 哪一个不是linux常用的shell,Linux下查看使用的是哪种shell的方法汇总
  9. 稳定的存储环境决定业务正常运作
  10. 《剑指Offer》 旋转数组的最小数字
  11. 吴恩达机器学习 2.矩阵和向量知识
  12. fonts.googleapis.com加载过慢导致的项目启动过慢的问题
  13. C++的string类
  14. 免费下载百度文库需下载券文件
  15. 用户生命周期分析全攻略
  16. 电子签章服务器位置的确定,一文看懂如何实现服务端电子签章
  17. 为什么只看重结果_只注重结果不注重过程的话
  18. 摸鱼三天,我写了一个通用的组建树TreeUtil工具
  19. 成功解决微信屏蔽网页跳转到app(apk)下载
  20. 阿里云ECS 云服务器和轻量应用服务器之间的区别

热门文章

  1. 你在成长为一个优秀的程序员吗
  2. Windows10共享文件夹、打印机,可是网络上显示“未授予用户在此计算机上的请求登录类型”的解决方案
  3. Spring-全局异常拦截
  4. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题
  5. 虚拟机可以识别usb无线网卡,但一直提示设备正在运行中--解决方法
  6. 【报告分享】科技产业2021年投资策略:科技进步与中美再平衡下的新机遇.pdf(附下载链接)...
  7. 【报告分享】2020年中国企业直播服务市场研究报告.pdf(附下载链接)
  8. 全球首发!计算机视觉Polygon Mesh Processing读书笔记——5微分几何中的弧长
  9. 对 比 学 习 小 综 述
  10. Leetcode每日一题:all-nodes-distance-k-in-binary-tree(二叉树中所有距离为K的节点)