基本知识

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 获取随机数的方式以及应用案例相关推荐

  1. java 计算随机数_JAVA获取随机数

    在Java中我们能够使用java.util.Random类来产生一个随机数发生器.它有两种形式的构造函数,各自是Random()和Random(long seed).Random()使用当前时间即Sy ...

  2. java 获取区间随机数_Java获取随机数的3种方法

    主要介绍了Java获取随机数的3种方法,主要利用random()函数来实现 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1))例: (int)(1+Math.rando ...

  3. java中的随机数_Java获取随机数

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

  4. java 获取区间随机数_Java获取随机数的几种方法

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

  5. java 获取区间随机数_Java获取随机数

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

  6. java 获取整型随机数_java获取随机数的几种方法

    1.Math.random()方法 例子:求1到10之间的随机数 public static void main(String[] args) { int n; for (int i = 0; i & ...

  7. java生成随机数的方法_Java获取随机数的3种方法

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

  8. java随机数转换_Java获取随机数的3种方法(转)

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

  9. java获取随机数方法_JAVA获取随机数

    原文链接: http://blog.csdn.net/herrapfel/article/details/1885016 在Java中我们可以使用java.util.Random类来产生一个随机数发生 ...

  10. java生成随机数random_Java获取随机数Random

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

最新文章

  1. AngularJs表单自动验证
  2. 用百度siteapp的uaredirect.js判断用户访问端而进行域名的自动跳转
  3. C++ 智能指针std::shared_ptr简单使用和理解
  4. git commit —amend_Git之修改commit记录
  5. XHTML Strict和Transitional 的区别
  6. QT 托盘图标退出延迟解决方案
  7. 在大城市打拼的你,是想留下还是想攒够了钱回家?
  8. linux内核那些事之pg_data_t、zone结构初始化
  9. Spring Cloud 微服务入门(一)--初识分布式及其发展历程
  10. Linux kill 多余用户终端
  11. ajax beforesend xhr对象,浅谈jQuery中Ajax事件beforesend及各参数含义
  12. 0x0000011b共享打印机无法连接解决方法
  13. 比勤奋更能决定人生的,是复利思维
  14. FS4052单节2A充电IC采用三段式充电管理IC
  15. 互联网dmz区_idc是什么行业(idc区和dmz区)
  16. 育碧信条:AI 在手,天下我有
  17. android 评论功能盖楼,微信公众号留言功能升级,评论区能“盖楼”了
  18. 一个功能较全的轮播图插件(含详细介绍)
  19. 不能完成此操作, 因为发生意外错误(错误代码-51)
  20. 汉诺塔小游戏 c语言

热门文章

  1. 空间复杂度和时间复杂度
  2. Logstash 初探
  3. 6.1-数据结构算法-堆栈与队列
  4. 034 Maven中的dependencyManagement和dependencies区别
  5. 原生js将数组分割成固定个数一组的小数组
  6. 推荐记录片系列:Ultimate Factories系列和MegaStructures系列
  7. 全局变量不能放在头文件其中
  8. 将ubuntu引导项加入windowsXP启动菜单中
  9. MySQL中的mysqldump命令使用详解
  10. 如何让插入PPT的音乐跨幻灯片后同时播放