MOFU MOFU

技術的なことから、趣味の分野までいろいろメモ程度に書いていきます

重複しない乱数の生成

友人から、配列の中にあるものを重複なしでランダムで取り出す方法ってどうやる?って聞かれまして、
愚直にやるんなら、2重ループ書いて、重複したら、また生成すればいいんじゃね。
いや、それだと賢くないなーって言ったら、

友人は、もうその方法で実装していたらしく、最悪ループの回数が恐ろしくなるので、賢い方法で
実装することにしました。

まずは、愚直に

	int[] a={10,11,12,13,14};
	boolean[] b = new boolean[5]; 
	int[] c = new int[5];

	for(int i=0;i<a.length;i++){
	    Random rand =new Random();
	    while(true){
		int n = rand.nextInt(a.length);
		if(b[n] == false) {
		    b[n] = true;
		    c[i] = a[n];
		    break;
		}
	    }
	    
	}

これだと、賢くないので、配列をシャッフルする方法にします。

	int[] a={10,11,12,13,14};
	//boolean[] b = new boolean[5]; 
	int[] c = a;

	for(int i=0;i<a.length;i++){
	    Random rand =new Random();
	    int n = rand.nextInt(a.length);
	    int temp = c[i];
	    c[i] = c[n];
	    c[n] = temp;
	    
	}

うんこれでシンプルになった。
使用する言語によりますが、Javaの場合は、ライブラリにshuffleがあるのでそちらを使ったほうが楽ですよ。