- /**
- * 随机指定范围内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;
- }
- /**
- * 随机指定范围内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){
- 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;
- }
- int[] result = new int[n];
- Random rd = new Random();
- int index = 0;
- for (int i = 0; i < result.length; i++) {
- //待选数组0到(len-2)随机一个下标
- index = Math.abs(rd.nextInt() % len--);
- //将随机到的数放入结果集
- result[i] = source[index];
- //将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换
- source[index] = source[len];
- }
- return result;
- }
- /**
- * 在一组不连续的数组中随机生成n个随机数
- * @param data 数组
- * @param n 随机数个数
- * @return int[] 随机数结果集
- */
- public static int[] randomNoRepeat(int[] data1,int n){
- int[] result = new int[n];
- Random r = new Random();
- int irdm = 0;
- for(int i = 0; i < n; i ++) {
- irdm = r.nextInt(11 - i);
- //[3, 5, 6, 8, 9, 15, 18, 24, 27, 30, 32]
- result[i] = data1[irdm];
- if(i == (n-1)){
- break;
- }
- for(int j = irdm; j < 11 - i - 1; j ++) {
- data1[j] = data1[j + 1];
- }
- }
- return result;
- }
- public static void main(String[] args) {
- int[] reult1 = randomCommon(0,10,3);
- System.out.println("方式1:");
- for (int i : reult1) {
- System.out.print(i + ",");
- }
- System.out.println();
- System.out.println("方式2:");
- int[] reult2 = randomArray(0,10,3);
- for (int i : reult2) {
- System.out.print(i + ",");
- }
- System.out.println();
- System.out.println("方式3:");
- HashSet<Integer> set = new HashSet<Integer>();
- randomSet(0,10,3,set);
- for (int j : set) {
- System.out.print(j + ",");
- }
- System.out.println();
- System.out.println("方式4:");
- int[] data1 = {3, 5, 6, 8, 9, 15, 18, 24, 27, 30, 32};
- int[] reult3 = randomNoRepeat(data1,3);
- for (int i : reult3) {
- System.out.print(i + ",");
- }
- }
Ajax
最新推荐文章于 2022-06-19 13:50:53 发布