java 正负随机_如何产生一个随机的[0, n)范围内的Short值
背景
最近在做一个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值相关推荐
- Java黑皮书课后题第3章:**3.4(随机月份)编写一个随机产生1和12之间整数的程序,并根据数组1,2,3...显示对应的月份
**3.4(随机月份)编写一个随机产生1和12之间整数的程序,并根据数组1,2,3...显示对应的月份 题目 题目描述 破题 代码 如何理解产生随机数 题目 题目描述 **3.4(随机月份)编写一个随 ...
- mysql st_contains实现_查看某一个点是否在某个多边形内 使用ST_Contains函数
查看某一个点是否在某个多边形内 使用ST_Contains函数 --LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.35 ...
- 暗黑再临Java增值版_暗黑破坏神-黑暗再临2.0巴尔归来【修改版】
地 图 名:暗黑破坏神-黑暗再临2.0巴尔归来[修改版] 地图类型:魔兽防守地图 地图作者:Promise6522 修改作者:黑之月 地图语言:中文 支持人数:1-7 魔兽版本:1.24E 修改介绍: ...
- java同花顺判定_笔试题:随机抽取五张牌 判断是否为同花顺
题目: 从一副扑克牌中随机抽取5张牌 判断这五张牌是否是一个同花顺 同花顺:点数连续 花色相同 大小王可以当做任意点数任意花色的牌 简单陈述一下思路 package cn.yangwanhao.wri ...
- 利用Java线程及JFrame面板制作一个随机摇号小程序
很多都是自己写的,慢慢的尝试,里面改了很多次数 但是最后的结果是没有错的 最后的最后终于得到想要的结果 慢慢的训练总能得到训练的 加油!!!! 上代码: import java.awt.Color; ...
- 使用java中Scanner,Randon,ArrayList完成一个随机点名系统
import java.util.*;public class Test01 {public static void main(String[] args) {//使用Arrays.asList创建一 ...
- android 随机播放代码,Android | 一个随机播放网络音乐的小 Demo
前言 是这样,前几天接触到一个可以随机获取网络音乐及其热评的 API(关于该API:github.com/isecret/yun- ),于是乎就想着要做一个小 demo 来练练手吧! 目前的效果就是上 ...
- 如何建立java ssm工程_如何搭建一个ssm项目
1.创建一个普通的maven项目,引入Spring MVC 的pom依赖 2.添加Spring的配置(xml方式applicationContext.xml)扫描除了controller包之外的包(扫 ...
- java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息
Jstack 用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息. 这里需要注意的是 Java 8 引入了 Java Mission Control, ...
最新文章
- akaze特征匹配怎么去掉不合适的点_SIFT特征点
- engine中调整Element的上下显示顺序(遮盖)
- linux c 宏判断多条件 #ifdef 和 #if defined 的区别
- 【❌❌vectorの奇技淫巧⭕⭕】C++ vector 如何正确处理动态申请内存的元素
- 通过key登录ssh
- Javascript覆盖率(jstd)报表解析Maven插件
- SAP CRM的Genil层和Hybris的jalo模型
- 哪一个不是linux常用的shell,Linux下查看使用的是哪种shell的方法汇总
- 稳定的存储环境决定业务正常运作
- 《剑指Offer》 旋转数组的最小数字
- 吴恩达机器学习 2.矩阵和向量知识
- fonts.googleapis.com加载过慢导致的项目启动过慢的问题
- C++的string类
- 免费下载百度文库需下载券文件
- 用户生命周期分析全攻略
- 电子签章服务器位置的确定,一文看懂如何实现服务端电子签章
- 为什么只看重结果_只注重结果不注重过程的话
- 摸鱼三天,我写了一个通用的组建树TreeUtil工具
- 成功解决微信屏蔽网页跳转到app(apk)下载
- 阿里云ECS 云服务器和轻量应用服务器之间的区别
热门文章
- 你在成长为一个优秀的程序员吗
- Windows10共享文件夹、打印机,可是网络上显示“未授予用户在此计算机上的请求登录类型”的解决方案
- Spring-全局异常拦截
- Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题
- 虚拟机可以识别usb无线网卡,但一直提示设备正在运行中--解决方法
- 【报告分享】科技产业2021年投资策略:科技进步与中美再平衡下的新机遇.pdf(附下载链接)...
- 【报告分享】2020年中国企业直播服务市场研究报告.pdf(附下载链接)
- 全球首发!计算机视觉Polygon Mesh Processing读书笔记——5微分几何中的弧长
- 对 比 学 习 小 综 述
- Leetcode每日一题:all-nodes-distance-k-in-binary-tree(二叉树中所有距离为K的节点)