Java获取随机数获取制定范围指定个数不重复的随机数
一.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总结的的经典的回答:
二.随机获取制定范围的制定个数的随机数
上代码:
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获取随机数获取制定范围指定个数不重复的随机数的更多相关文章
- Lua在给定范围内,生成指定个数不重复随机数组
本篇主要是参考 lua连续随机数 这篇文章完成.大家可以去原贴查看学习. 生成随机数组,暂时发现两种方法 1.把生成的数放到一个表里面,每次随机时判断这个表里是否有,若有再随机一次(问了朋友,很多人都 ...
- 用java实现取1-100之间的99个不重复的随机数 然后输出没有被取出的数字
package cn.kgc.springtest2.demo1.dao; import java.util.BitSet; /** * @author * @create 2019-08-02 17 ...
- 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 ...
- 论 Java 中获取一组不重复的随机数之性能问题
今天在做一个Java项目, 用到了使用一组不重复的随机数问题, 不管怎么做随机数里面总有几个是重复的. 于是上网去找资料, 在网上找到的资料中大部分都是一个思路: 网上的思路一:(性能不理想) 先生成 ...
- JAVA中获取不重复的随机数
我们知道 Random random = new Random() 中可能会获取到重复的随机数 那么假设要获取1到33之间的六个不重复随机数应该怎么做呢? 首先定义一个数字数组存储1到33 int[ ...
- java随机数获取
/**Number One: * 随机数获取公式:(数据类型)(最小值+Math.random()*(最大值-最小值+1)) * 随机数获取公式:(类型)最小值+Math.random()*最大值 * ...
- java调用shell获取返回值
转自:http://blog.csdn.net/tengdazhang770960436/article/details/12014839 1.shell文件return.sh echo 1 echo ...
- (部署新java程序,程序报错,需copy的一个包)——java使用siger 获取服务器硬件信息
mcat-siger.sh 查看是否安装siger rsync -aPuv /usr/lib64/libsigar-amd64-linux.so $i:/usr/lib64/ java使用siger ...
- JAVA文件中获取路径及WEB应用程序获取路径方法
JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...
随机推荐
- s4-2 ALOHA 协议
多路访问协议 随机访问协议(Random Access) 特点:站点争用信道,可能出现站点之间的冲突 典型的随机访问协议 • ALOHA协议 • CSMA协议 • CSMA/CD协议(以太网采 ...
- IntelliJ IDEA 2017版 spring-boot 2.03 去除控制台logo;去除springboot 图标;去除springboot 图
1.控制台出现logo图标 2.如果不喜欢,如何去除这个logo 在其Application中进行设置 package com.springboot.logo; import org.springfr ...
- screen对象和history对象
history对象保存着用户上网的历史记录,从窗口被打开的那一刻开始算起 使用go()方法可以在用户的历史记录中任意跳转 history.go(-1);//后退一页 history.go(1);//前 ...
- RGB,YCBCR在HDMI传输线是数据排列
RGB4:4:4 YCbCr4:4:4 YCbCr4:2:2 YCbCr4:2:0
- (转)设置VMWARE通过桥接方式使用主机无线网卡上网
转自:http://www.cnblogs.com/liongis/p/3265458.html 环境:WIN7旗舰版,台式机,U盘无线上网卡. 虚拟软件:VMware9.0,虚拟系统:CentOS6 ...
- [Selenium With C#基础教程] Lesson-01环境搭建
作者:Surpassme 来源:http://www.jianshu.com/p/33b87bc00233 声明:本文为原创文章,如需转载请在文章页面明显位置给出原文链接,谢谢. 最近开始复习Sele ...
- Codeforces812B Sagheer, the Hausmeister 2017-06-02 20:47 85人阅读 评论(0) 收藏
B. Sagheer, the Hausmeister time limit per test 1 second memory limit per test 256 megabytes input s ...
- Rescue HDU1242 (BFS+优先队列) 标签: 搜索 2016-05-04 22:21 69人阅读 评论(0)
Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is describe ...
- 三.int , bool , str
03.万恶之源-基本数据类型(int, bool, str) 本节主要内容: 1. python基本数据类型回顾 2. int----数字类型3. bool---布尔类型4. str--- 字符串类 ...
- 4.css基础
1 Css概念 CSS 指层叠样式表 (Cascading Style Sheets)(级联样式表) Css是用来美化html标签的,相当于页面化妆. ◆样式表书写位置 2选择器 2.1 写法 选择器 ...