一.JDK中提供的两种方式

1.Math类中的random()方法
public static double random()
返回带正号的 double 值,该值大于等于 0.0 且小于 1.0 [0.0,1.0)。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。

2.Random类中的 nextInt()方法
public int nextInt()
返回一个随机数,所有 2的32次方个可能 int 值的生成概率(大致)相同。

public int nextInt(int n)
返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。
nextInt 的常规协定是,伪随机地生成并返回指定范围中的一个 int 值。所有可能的 n 个 int 值的生成概率(大致)相同。

参数:
n - 要返回的随机数的范围。必须为正数。
返回:
随机数生成器序列中 0(包括)和 n(不包括)之间  [0,n) 均匀分布的 int 值。
抛出:
IllegalArgumentException - 如果 n 不是正数

StackOverFlow总结的的经典的回答:

https://stackoverflow.com/questions/363681/how-do-i-generate-random-integers-within-a-specific-range-in-java

二.随机获取制定范围的制定个数的随机数

上代码:

 import java.util.HashSet;
import java.util.Random; public class GenerateRandomNumber { public static void main(String[] args) {
//一、JAVA中生成随机数的方式
//①
//int randomNumber = (int) Math.round(Math.random()*(max-min)+min); //②
//long randomNum = System.currentTimeMillis();
//int randomNumber = (int) randomNum%(max-min)+min; //③
//Random random = new Random();
//int randomNumber = random.nextInt(max)%(max-min+1) + min; //方法一:最简单最易理解的两重循环去重
// int[] reult1 = randomCommon(20, 50, 10);
// for (int i : reult1) {
// System.out.println(i);
// } //方法二:利用HashSet的特征,只能存放不同的值
// HashSet<Integer> set = new HashSet<Integer>();
// randomSet(20, 50, 10, set);
// for (int j : set) {
// System.out.println(j);
// } //方法三:排除已随机到的数
int[] reult2 = randomArray(0, 20, 18);
// for (int i : reult2) {
// System.out.println(i);
// }
} //二、随机给定范围内N个不重复的数
/**
* 方法一:最简单最易理解的两重循环去重
* 随机指定范围内N个不重复的数
* 最简单最基本的方法
* @param min 指定范围最小值
* @param max 指定范围最大值
* @param n 随机数个数
*/
public static int[] randomCommon(int min, int max, int n){
if (n > (max - min + 1) || max < min) {
return null;
}
int[] result = new int[n];
int count = 0;
while(count < n) {
int num = (int) (Math.random() * (max - min)) + min;
boolean flag = true;
for (int j = 0; j < n; j++) {
if(num == result[j]){
flag = false;
break;
}
}
if(flag){
result[count] = num;
count++;
}
}
return result;
} /**
* 方法二:利用HashSet的特征,只能存放不同的值
* 随机指定范围内N个不重复的数
* 利用HashSet的特征,只能存放不同的值
* @param min 指定范围最小值
* @param max 指定范围最大值
* @param n 随机数个数
* @param HashSet<Integer> set 随机数结果集
*/
public static void randomSet(int min, int max, int n, HashSet<Integer> set) {
if (n > (max - min + 1) || max < min) {
return;
}
for (int i = 0; i < n; i++) {
// 调用Math.random()方法
int num = (int) (Math.random() * (max - min)) + min;
set.add(num);// 将不同的数存入HashSet中
}
int setSize = set.size();
// 如果存入的数小于指定生成的个数,则调用递归再生成剩余个数的随机数,如此循环,直到达到指定大小
if (setSize < n) {
randomSet(min, max, n - setSize, set);// 递归
}
} /**
* 方法三:排除已随机到的数
* 随机指定范围内N个不重复的数
* 在初始化的无重复待选数组中随机产生一个数放入结果中,
* 将待选数组被随机到的数,用待选数组(len-1)下标对应的数替换
* 然后从len-2里随机产生下一个随机数,如此类推
* @param max 指定范围最大值
* @param min 指定范围最小值
* @param n 随机数个数
* @return int[] 随机数结果集
*/
public static int[] randomArray(int min,int max,int n){
//min=20 max=40 n=10
int len = max-min+1; if(max < min || n > len){
return null;
} //初始化给定范围的待选数组
int[] source = new int[len];
for (int i = min; i < min+len; i++){
source[i-min] = i;
}
//source 初始化之后就是min~max(包括首尾) 之间的所有数字的一个数组.[20,21...,10] int[] result = new int[n];
Random random = new Random();
int index = 0;
for (int i = 0; i < result.length; i++) {
System.out.println("第"+i+"次循环"); int randomInt = random.nextInt();
int maxEffectiveArraySubScript = len--;//最大有效数组下标,数组中超过这个下标的值都没有用了...
//待选数组0到(len-2)随机一个下标 除数(maxEffectiveArraySubScript) 取余 范围为(0~maxEffectiveArraySubScript-1)
//即(0~maxEffectiveArraySubScript-1) <==> 0到(len-2)
index = Math.abs(randomInt % maxEffectiveArraySubScript ); System.out.println("randomInt:"+randomInt+",原数组最大有效角标:"+maxEffectiveArraySubScript+",index:"+index);
System.out.println("原数组有效检索子数组:");
printArray(source,maxEffectiveArraySubScript);
System.out.println(""); //将随机到的数放入结果集
result[i] = source[index];
System.out.println("找到的数为:"+result[i]);
//将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换 ,这样确保"有效检索子数组"中后面没有检索到的数据前移,下一次仍可能随机找到.
//因为每一次循环 原数组的有效长度都是-1的...
source[index] = source[len]; System.out.println("原数组变成:");
printArray(source);
System.out.println("");
System.out.println("目标数组为:");
printArray(result);
System.out.println("");
}
return result;
} public static void printArray(int [] intArray){
for (int i = 0; i < intArray.length; i++) {
System.out.print(intArray[i]+",");
}
} public static void printArray(int [] intArray,int maxArrayNum){
for (int i = 0; i < maxArrayNum; i++) {
System.out.print(intArray[i]+",");
}
}
}

方法三:相对有点不好理解,我加上了打印内容.方便理解.

Java获取随机数获取制定范围指定个数不重复的随机数的更多相关文章

  1. Lua在给定范围内,生成指定个数不重复随机数组

    本篇主要是参考 lua连续随机数 这篇文章完成.大家可以去原贴查看学习. 生成随机数组,暂时发现两种方法 1.把生成的数放到一个表里面,每次随机时判断这个表里是否有,若有再随机一次(问了朋友,很多人都 ...

  2. 用java实现取1-100之间的99个不重复的随机数 然后输出没有被取出的数字

    package cn.kgc.springtest2.demo1.dao; import java.util.BitSet; /** * @author * @create 2019-08-02 17 ...

  3. js生成1-100不重复的随机数及生成10个1-100不重复的随机数

    //生成1-100不重复的随机数 var count=100; var a=new Array(); for(var i=0;i<100;i++){ a[i]=i+1; } a.sort(fun ...

  4. 论 Java 中获取一组不重复的随机数之性能问题

    今天在做一个Java项目, 用到了使用一组不重复的随机数问题, 不管怎么做随机数里面总有几个是重复的. 于是上网去找资料, 在网上找到的资料中大部分都是一个思路: 网上的思路一:(性能不理想) 先生成 ...

  5. JAVA中获取不重复的随机数

    我们知道 Random random = new  Random() 中可能会获取到重复的随机数 那么假设要获取1到33之间的六个不重复随机数应该怎么做呢? 首先定义一个数字数组存储1到33 int[ ...

  6. java随机数获取

    /**Number One: * 随机数获取公式:(数据类型)(最小值+Math.random()*(最大值-最小值+1)) * 随机数获取公式:(类型)最小值+Math.random()*最大值 * ...

  7. java调用shell获取返回值

    转自:http://blog.csdn.net/tengdazhang770960436/article/details/12014839 1.shell文件return.sh echo 1 echo ...

  8. (部署新java程序,程序报错,需copy的一个包)——java使用siger 获取服务器硬件信息

    mcat-siger.sh  查看是否安装siger rsync -aPuv /usr/lib64/libsigar-amd64-linux.so $i:/usr/lib64/ java使用siger ...

  9. JAVA文件中获取路径及WEB应用程序获取路径方法

    JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...

随机推荐

  1. Check the NativeLink log file

    今天用Quartus ii16.1仿真Cyclone IV的IP核DDR2,总是报上面的错误 .网上都说是modelsim路径的问题, 但我确定不是.最后用QaurtusII 12.1可以通道仿真. ...

  2. 【慕课网实战】Spark Streaming实时流处理项目实战笔记一之铭文升级版

    第一章:课程介绍 铭文一级: VMware Fusion Mac上搭建:为了给大家演示如何使用我们的OOTB环境 Hadoop环境:虚拟机,我是远程登录 Mac 那么就不需要使用我们的OOTB环境 V ...

  3. Redis-5.0.0集群配置

    版本:redis-5.0.0 参考:http://redis.io/topics/cluster-tutorial. 集群部署交互式命令行工具:https://github.com/eyjian/re ...

  4. 1101 Quick Sort

    There is a classical process named partition in the famous quick sort algorithm. In this process we ...

  5. 20180705 fragment

    https://www.cnblogs.com/chaowang/p/6180825.html https://blog.csdn.net/xxkalychen/article/details/537 ...

  6. Java理论学时第二节。课后作业。

    枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象,相同的值则引用同一个对象. 可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals ...

  7. Jmeter-接口功能测试

    前言 前面已经讲过了如何用Postman做接口功能测试,本篇主要是用Jmeter来演示如何做接口功能测试,这里就大致说一下Jmeter如何用哈,其余的也不多说了. Jmeter接口功能测试实例 因为在 ...

  8. 对工程测量大师App的评价

    我是测绘工程专业的学生,去年由于同学的推荐我开始使用工程测量大师这款App. 工程测量大师是一款非常方便的测量计算软件,用户将测量的数据输入后,软件就可以帮助你得到精确的计算结果.操作非常简单,使用起 ...

  9. WP8整合Bing应用,生活有求Bing

    在Windows 8中,Bing应用一直随系统而存在,提供多样化的资讯.它们是我的“御用”App,因为可以根据我的使用习惯对应用进行定制. 在Windows Phone 8系统第三次官方更新之后, B ...

  10. SPFA_queue_链式前向星最短路 & HDU2433

    题目大意:看完之后,觉得不肯能让我暴力,比较好想的就是初始化——每个点都求个最短路spfa,sum数组记录每个点到各个点的最短路之和,ans作为总和,之后一一删除边u-v,求关于u的最短路,如果dis ...