产生N以内的不重复的随机数

1. 常规思路:去重法

用map来记录产生的随机数,如果存在这个数,就重新产生一个新数。

public static int[] simple(int n){
		int[] ans = new int[n];
		Map<Integer,Boolean> map = new HashMap<Integer,Boolean>();
		int d=0;
		for(int i=0;i<n;i++){
			d= (int)(Math.random()*n);
			while(map.containsKey(d)){
				d= (int)(Math.random()*n);
			}
			ans[i]=d;
			map.put(ans[i], true);
		}
		return ans;
	}

2.用list来实现,先将所有的数放到list里,产生随机数的的循环里,每次都产生一个随机的下标,将这个下标中的值输出后,删除。

public static int[] listMethod(int n){
		int[] ans = new int[n];
		List<Integer> list = new ArrayList<Integer>();
		int d=0,i=0;
		for(i=0;i<n;i++)list.add(i);
		for(i=0;i<n;i++){
			d= (int)(Math.random()*list.size());
			ans[i]=list.get(d);
			list.remove(d);
		}
		return ans;
	}


3. 最高效的算法:先初始化数组,再循环一次,交换每次产生的随机数和i的值

public static int[] complex(int n){
		int[] ans = new int[n];
		int i=0;
		for(i=0;i<n;i++)ans[i]=i;
		int d = 0;
		for(i=0;i<n;i++){
			d= (int)(Math.random()*n);
			swap(ans,i,d);
		}
		return ans;
	}
	
	public static void swap(int[] n,int i,int j){
		int t=n[i];
		n[i]=n[j];
		n[j]=t;
	}


你可能感兴趣的:(产生N以内的不重复的随机数)