高效產生一組不重複的隨機數(受程式設計珠磯啟示)java實現

yangxi_001發表於2013-11-13

高效產生一組不重複的隨機數這個需求應該是很常見的吧,需要從 0 到 n 之間選 k 個不重複的陣列成一個序列。演算法複雜度O(n),受程式設計珠磯啟示,我用java寫了該演算法的實現,由於時間比較緊,其他的以後補充吧,直接上演算法和效果:

import java.util.Scanner;

//隨機生成n個不重複隨機數,演算法複雜度O(n) 受程式設計珠磯啟示
public class Test2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//輸入產生隨機數的個數n
		System.out.println("輸入產生隨機數的個數n:");
		int n = sc.nextInt();
		//初始化一個陣列
		int[] arr = new int[n];
		for(int i=0;i<arr.length;i++){
			arr[i]=i;
		}
		
		//交換陣列中的兩個元素值
		for(int i=0;i<arr.length;i++){
			swap(arr,i,randInt(i,arr.length-1));
		}
		
		//輸出隨機後的陣列值
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
			if((i+1)%10==0)
				System.out.println();
		}
		
	}

	//randInt()函式的實現
	private static int randInt(int x,int y){
		//return (int)(Math.random()*100%(y-x+1)+x);//這個演算法還是不好
		return (int)(Math.random()*(y-x+1)+x);
	}
	
	//實現swap()方法
	private static void swap(int[] arr,int x,int y){
		int temp ;
		temp = arr[x];
		arr[x] = arr[y];
		arr[y] = temp;
	}
}

執行結果:

我們有時候需要進行一些資料的測試,苦於沒有這些資料,我的初衷也是如此,我也折騰了很久,發現目前這種方法的效率是最高的,貼出來同有需要的朋友分享一下,有不妥之處還望各位網友朋友不吝賜教。

相關文章