生成指定范围的随机数_JAVA 获取随机数的方式以及应用案例
基本知识
java中获取随机数主要有2种方式,一个是Random类获取,一个是用math类的获取。
- Math类
方法名称 double java.lang.Math.random()
方法说明 返回一个[0.0,1.0)之间的double类型数据
- Random类
方法名称(包括nextInt,nextLong,nextBytes,nextDouble,nextBoolean等,用法类似,下面以nextInt为例)
int java.util.Random.nextInt();
int java.util.Random.nextInt(int);
方法说明 不带参数的nextInt获取2^32中任何一个数字整形数字(包括负数),带参数的获取一个大于等于0小于指定参数的整形数字
用法演示
下面针对这2中方法获取随机数,在实际应用场景中,一般都定义范围内获取。
- Math.random
public static void main(String[] args) {//获取一个[0,100)之间的随机数int a = (int)(Math.random()*100);//获取一个[-50,50)之间的随机数int b = (int)(Math.random()*100) - 50;//获取一个[-20,120)之间的随机数int c = (int)(Math.random()*140) - 20;System.out.println(a);System.out.println(b);System.out.println(c);}
- Random.nextInt
public static void main(String[] args) {Random random = new Random();//获取一个随机数int a = random.nextInt();//获取[0,130)之间的随机数int b = random.nextInt(130);//获取一个[-50,50)之间的随机数int c = random.nextInt(100) - 50;//获取一个[-20,120)之间的随机数int d = random.nextInt(140) - 20;System.out.println(a);System.out.println(b);System.out.println(c);System.out.println(d);}
进阶知识
1、获取一个指定范围内指定长度的随机数组,数组内随机数可能重复
public class RandomUtils {/*** 获取一个指定范围内指定长度的随机数组* * @param begin* 范围开始位置(包括)* @param end* 范围结束位置(不包括)* @param length* 返回的数组长度* @return int[] 返回的数组*/public static int[] getRandomArray(int begin, int end, int length) {// 参数校验if (begin >= end || length == 0) {return null;}//随机数生成器Random random = new Random();int[] array = new int[length];for(int i=0;i<length;i++){// 数组填充随机数array[i] = random.nextInt(end-begin) + begin;}return array;}public static void main(String[] args) {int[] array = RandomUtils.getRandomArray(10,100,5);if(array == null) return ;for(int i=0;i<array.length;i++){System.out.printf("%3d",array[i]);}}
}
2、获取一个指定范围内指定长度的不重复随机数组
思路一:每次获取随机数,然后和现有的比对,不重复则保存,重复则丢弃,重新获取。
思路二:将范围内所有的数字保存到缓存中,然后从中随机获取一个数字,并将该数字从缓存清除。
分析:思路一针对范围大,获取数据数组长度小比较适用,重复概率低。思路二针对范围小,获取数组长度大(甚至等于范围大小)时比较实用。从时间复杂度和空间复杂度来说,思路二远高于思路一,本次案例选用思路二实现。
public class RandomUtils {/*** 获取一个指定范围内指定长度的不重复的随机数组* * @param begin* 范围开始位置(包括)* @param end* 范围结束位置(不包括)* @param length* 返回的数组长度* @return int[] 返回的数组*/public static int[] getNoRepeatRandomArray(int begin, int end, int length) {// 参数校验if (begin >= end || length == 0 || (end-begin) < length) {return null;}// 随机数生成器Random random = new Random();//用arrayList保存数值List<Integer> list = new ArrayList<>();for(int i=begin;i<end;i++){list.add(i);}//随机一个位置int[] array = new int[length];int index = 0;for(int i=0;i<length;i++){index = random.nextInt(list.size());array[i] = list.get(index);// 将已经获取的数组从list中删除list.remove(index);}return array;}public static void main(String[] args) {int[] array = RandomUtils.getNoRepeatRandomArray(10, 16, 7);if(array == null) return; for (int i = 0; i < array.length; i++) {System.out.printf("%3d", array[i]);}}
}
项目实战
利用进阶知识中的获取不重复的随机数方法,完成52张扑克牌的洗牌并发放到4个玩家。
分析:本案例有多种实现方式,例如将一张扑克牌定义一个类,包括花色,数字等,由于本案例只是演示随机数的应用,故采用以下方法:
定义一个长度为52的数字,指定数字1-13为红桃,14-26为方块,27-39位黑桃,40-52为梅花,同理,1,14,27,40为A,2,15,28,41为2...,具体实现如下:
public static void main(String[] args) {// 获取52张不重复的数组int[] array = RandomUtils.getNoRepeatRandomArray(1, 53, 52);int[] userA = new int[13];int[] userB = new int[13];int[] userC = new int[13];int[] userD = new int[13];// 将牌发放给4个玩家System.arraycopy(array, 0, userA, 0, 13);System.arraycopy(array, 13, userB, 0, 13);System.arraycopy(array, 26, userC, 0, 13);System.arraycopy(array, 39, userD, 0, 13);// 按花色排序打印Arrays.sort(userA);System.out.println("玩家A获取的牌面为:" + printCardArray(userA));Arrays.sort(userB);System.out.println("玩家B获取的牌面为:" + printCardArray(userB));Arrays.sort(userC);System.out.println("玩家C获取的牌面为:" + printCardArray(userC));Arrays.sort(userD);System.out.println("玩家D获取的牌面为:" + printCardArray(userD));}/*** 打印玩家的牌面* @param array* @return*/
private static String printCardArray(int[] array){StringBuffer sb = new StringBuffer();for(int i=0;i<array.length;i++){sb.append(printCard(array[i]) + " ");}return sb.toString();
}/*** 将数字转换为牌面* @param n* @return*/
private static String printCard(int n){int color = (n-1)/13;int num = (n-1)%13 + 1;String colorStr;String numStr;switch(color){case 0:colorStr = "红桃";break;case 1:colorStr = "方块";break;case 2:colorStr = "黑桃";break;case 3:colorStr = "梅花";break;default:colorStr = null;}switch(num){case 11:numStr = "J";break;case 12:numStr = "Q";break;case 13:numStr = "K";break;case 1:numStr = "A";break;default:numStr = num+""; }return colorStr + numStr;
}
---------------------------------------------------
玩家A获取的牌面为:红桃A 红桃4 红桃7 红桃10 方块A 方块5 方块J 方块Q 黑桃2 梅花3 梅花6 梅花8 梅花Q
玩家B获取的牌面为:红桃3 红桃5 红桃K 方块3 方块4 方块7 方块10 黑桃9 黑桃Q 梅花4 梅花5 梅花9 梅花K
玩家C获取的牌面为:红桃2 红桃8 红桃9 红桃Q 方块2 方块6 方块K 黑桃4 黑桃6 黑桃7 黑桃8 梅花A 梅花10
玩家D获取的牌面为:红桃6 红桃J 方块8 方块9 黑桃A 黑桃3 黑桃5 黑桃10 黑桃J 黑桃K 梅花2 梅花7 梅花J
生成指定范围的随机数_JAVA 获取随机数的方式以及应用案例相关推荐
- java 计算随机数_JAVA获取随机数
在Java中我们能够使用java.util.Random类来产生一个随机数发生器.它有两种形式的构造函数,各自是Random()和Random(long seed).Random()使用当前时间即Sy ...
- java 获取区间随机数_Java获取随机数的3种方法
主要介绍了Java获取随机数的3种方法,主要利用random()函数来实现 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1))例: (int)(1+Math.rando ...
- java中的随机数_Java获取随机数
随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...
- java 获取区间随机数_Java获取随机数的几种方法
随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...
- java 获取区间随机数_Java获取随机数
随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...
- java 获取整型随机数_java获取随机数的几种方法
1.Math.random()方法 例子:求1到10之间的随机数 public static void main(String[] args) { int n; for (int i = 0; i & ...
- java生成随机数的方法_Java获取随机数的3种方法
随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...
- java随机数转换_Java获取随机数的3种方法(转)
随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...
- java获取随机数方法_JAVA获取随机数
原文链接: http://blog.csdn.net/herrapfel/article/details/1885016 在Java中我们可以使用java.util.Random类来产生一个随机数发生 ...
- java生成随机数random_Java获取随机数Random
随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...
最新文章
- AngularJs表单自动验证
- 用百度siteapp的uaredirect.js判断用户访问端而进行域名的自动跳转
- C++ 智能指针std::shared_ptr简单使用和理解
- git commit —amend_Git之修改commit记录
- XHTML Strict和Transitional 的区别
- QT 托盘图标退出延迟解决方案
- 在大城市打拼的你,是想留下还是想攒够了钱回家?
- linux内核那些事之pg_data_t、zone结构初始化
- Spring Cloud 微服务入门(一)--初识分布式及其发展历程
- Linux kill 多余用户终端
- ajax beforesend xhr对象,浅谈jQuery中Ajax事件beforesend及各参数含义
- 0x0000011b共享打印机无法连接解决方法
- 比勤奋更能决定人生的,是复利思维
- FS4052单节2A充电IC采用三段式充电管理IC
- 互联网dmz区_idc是什么行业(idc区和dmz区)
- 育碧信条:AI 在手,天下我有
- android 评论功能盖楼,微信公众号留言功能升级,评论区能“盖楼”了
- 一个功能较全的轮播图插件(含详细介绍)
- 不能完成此操作, 因为发生意外错误(错误代码-51)
- 汉诺塔小游戏 c语言