当前位置 : 主页 > 编程语言 > java >

N个数中随机依次获得的高效率算法--代码实现

来源:互联网 收集:自由互联 发布时间:2021-06-28
提供效率较高的代码片段 首先提供几个思路: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;
	}

    当然此函数不够健壮,有很多情况没有考虑到,欢迎提出修改意见,不胜感激
网友评论