提供效率较高的代码片段 首先提供几个思路: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;
}
当然此函数不够健壮,有很多情况没有考虑到,欢迎提出修改意见,不胜感激
