一.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. 锋利的jQuery(第二版)学习总结

    通过对<锋利的jQuery>(第二版)一书的学习,发现此书讲解通俗易懂,是学习jQuery的一本很好的指导书,特作如下总结. 此书主要讲解了jQuery的常用操作,包括认识jQuery,j ...

  2. Oracle 数据库 dbConsole 配置笔记

    Oracle安装后,DBConsole有时安装会失败,这时可以通过以下命令恢复: set oracle_sid=orclemca -repos recreateemca -config dbcontr ...

  3. 【1】C#文件操作之目录操作

    命名空间:System.IO Directory类下的静态方法: 一.创建目录 Directory.CreateDirectory(string fileName); 二.获取指定目录下的所有文件名 ...

  4. 《SQL必知必会》笔记

    SQL必知必会(第4版) 作者:[美]Ben Forta 本书介绍了sql在不同数据库工具(Oracle.SQLite.SQL server.MySQL.MariaDB.PostgreSQL...)是 ...

  5. STL容器-- forward_list 用法

    http://www.cplusplus.com/reference/forward_list/

  6. JS 对象(Object)和字符串(String)互转方法

    利用原生JSON对象,将对象转为字符串 1 2 3 4 5 6 var jsObj = {}; jsObj.testArray = [1,2,3,4,5]; jsObj.name = 'CSS3'; ...

  7. jQuery插件初级练习3答案

    html: $("p").fontcolor().html("qaq") jQuery: $.fn.extend({ fontcolor:function(){ ...

  8. jwt身份认证

    项目地址:https://github.com/cuongle/WebApi.Jwt

  9. java的环境变量

    Java学习第一步——JDK安装及Java环境变量配置  2014-05-30 9:09  Java SE  阿超  9226 views Java作为当下很主流的编程语言,学习Java的朋友也越来越 ...

  10. Excel 两列单元格合并超级链接的VBA 写法

    Excel 单元格 分两列 (B列存放姓名, C列存放链接) 列如: 姓名 学号 博客地址 1309032022 李汉超 http://www.cnblogs.com/Vpygamalion/ 141 ...