はじめまして。
新人プログラマーで、現在、柴田望洋氏の「解きながら学ぶJava 入門編」を四苦八苦しながら解き進めています。
今回は上記書籍に載っている、とあるアルゴリズムについてご質問させていただきたく思います。
問題6-13(191ページ~192ページ)「配列の要素の並びをシャッフルする(ランダムな順となるようにかき混ぜる)プログラム」を作成する問題についてです。
回答には以下のような答えが載っておりますが
Java
1 public static void main(String[] args) { 2 Random rand = new Random(); 3 Scanner stdIn = new Scanner(System.in); 4 5 System.out.print("要素数:"); 6 int n = stdIn.nextInt(); 7 int[] a = new int[n]; 8 9 for(int i =0; i < n; i++){ 10 System.out.print("a[ "+ i + "] = "); 11 a[i] = stdIn.nextInt(); 12 } 13 14//////////////////シャッフルの処理/////////////////// 15 for(int i = 0; i < 2 * n; i++) { 16 int idx1 = rand.nextInt(n); 17 int idx2 = rand.nextInt(n); 18 int t = a[idx1]; 19 a[idx1] = a[idx2]; 20 a[idx2] = t; 21 } 22////////////////////////////////////////////////////// 23 24 System.out.println("要素をかき混ぜました。"); 25 for(int i =0; i < n; i++){ 26 System.out.println("a[ "+ i + "] = " + a[i]); 27 } 28 29 }
一方で、次頁にはシャッフルの処理部分で「もっと効率のよいアルゴリズムも考案されてます」とあり、以下のコードが紹介されています。
Java
1//////////////////シャッフルの処理/////////////////// 2 for(int i = n - 1; i > 0; i--){ 3 int j = rand.nextInt(i + 1); 4 if(i != j) { 5 int t = a[i]; 6 a[i] = a[j]; 7 a[j] = t; 8 } 9 } 10////////////////////////////////////////////////////// 11
このコードについて疑問点が2つあります。
①なぜrand.nextInt(i + 1);の箇所でループ毎に生成する乱数の数を減らしていくのか?
②for(int i = n - 1; i > 0; i--)と配列の後ろ→前にかけて探索していくのはなぜか?
for(int i = 1; i < n; i++)として前→後ろの順で探索して言っていけない理由は?
どなたかご教示いただけたら幸いです。よろしくお願いします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/14 15:27
2015/09/14 15:55 編集
2015/09/15 00:22
2015/09/16 00:10