提供效率较高的代码片段 首先提供几个思路:1. 数组+随机数生成,然后每次比较该数是否存在,若存在则重新生成随机数,知道数组中有了需要的N个数2. Set集合+随机数:利用Set集合的
首先提供几个思路: 1. 数组+随机数生成,然后每次比较该数是否存在,若存在则重新生成随机数,知道数组中有了需要的N个数 2. Set集合+随机数:利用Set集合的不可重复性,生成随机数,然后往set中add,判断是否Set集合有了N个数,否则循环随机数生成+add 3. 然后一个效率比较高的算法:洗牌算法,实际上不是随机数,洗牌 思想:洗牌算法。取出N个数中M个不重复的数 1到n按顺序排好 开始洗牌,for i=1到n 随机出一个数,将这个数当下标,和第i个数交换 洗完牌后,取前面m个数即是要求的 int startArray[] = {0,1,2,3,4,5,6,7,8,9}; //seed array int N = 10; //随机数个数 int resultArray[] = new int [10]; //结果存放在里面 for(int i = 0; i < N; i++) { int seed = random(0, startArray.length - i);//从剩下的随机数里生成 resultArray[i] = startArray[seed]; //赋值给结果数组 startArray[seed] = startArray[startArray.length - i - 1];//把随机数产生过的位置替换为未被选中的值。 } 记下来以后可以直接用了 ==============11.16修改===== 我封装成了一个函数,可以自取使用 /** * 随机从arr数组中获得count个不重复的数。注意此函数会弄乱arr原有的顺序, * 如果不想乱序,则修改以下函数,或者传一个copy的arr过来就可以 * @param arr 随机数的源数组 * @param count 需要随机数的个数 * @return */ public static int[] getNotRepeatRandom(int[] arr,int count){ Random random = new Random(); int resultArray[] = new int[count]; //结果存放在里面 for(int i = 0; i < count; i++) { int seed; //int seed = random(0, startArray.length - i);//从剩下的随机数里生成 //下方的if判断只是为了避免random.nextInt处理0值 if(arr.length - i > 0){ seed = random.nextInt(arr.length - i);//从剩下的随机数里生成 }else{ seed = 0; } resultArray[i] = arr[seed]; //赋值给结果数组 //把随机数产生过的位置替换为未被选中的值。以下只是一个交换,不借助第三个变量 arr[seed] = arr[seed] + arr[arr.length - i - 1]; arr[arr.length - i - 1] = arr[seed] - arr[arr.length - i - 1]; arr[seed] = arr[seed] - arr[arr.length - i - 1]; } return resultArray; } 当然此函数不够健壮,有很多情况没有考虑到,欢迎提出修改意见,不胜感激