プログラミング自主学習 DAY72 Collections.Shuffle

2023/08/07に公開

Collections.shuffle

5 X 5のビンゴをHashSet collectionを活用して作る宿題だった。

1. 0~50までの整数の中で、25個の乱数を抽出し、二次元配列に追加することにした。
2. 乱数はDoubleにリータンするMath.random()を使わず、RandomクラスのnextInt()メソッド を通して、すぐ整数を抽出した。
3. HashSetに込めている25個の数をIteratorを通して、配列の要素に入れる。

しかし、なぜか3のプロセスでこのような問題が出た。

 3  5  6  7 10 
11 15 16 17 18 
20 21 24 27 28 
29 32 33 34 40 
41 42 43 44 48 

きっと、無差別的に値を抜くはすだったHashSetなのに、整列されたまま、indexに入る現象があった。これは、、ビンゴじゃなく、カレンダーでしょう?

最初は、ChatGPTでコードをチェックしてみたが、ChatGPTからは、原因が把握できず、20分ほどググってみた結果、興味深い事実を見つけた。
Hashing Algorithmというものの存在だ。

検索した結果、このような場合はArrayListと Collections クラスの shuffle というメソッドで、解決できそうだ。
また、この過程で、ArrayListのコンストラクタがsetを込められることがわかった。
以下が最終コードと結果になる。

BinggoTest

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;


public class BinggoTest {

public static void main(String[] args) {
		
 HashSet<Integer> set = new HashSet<>();
 Random random = new Random(System.currentTimeMillis());
 int[][] bingo = new int[5][5];
		
 while(set.size()!=25) {
	int num = (random.nextInt(49)+1);
	set.add(num);
   }
			
 ArrayList<Integer> list = new ArrayList<Integer>(set);
 Collections.shuffle(list);
 Iterator<Integer> iter = list.iterator();
		
    for(int i=0; i<5; i++) {
	for(int j=0; j<5; j++) {
		bingo[i][j] = iter.next();
		System.out.printf("%2d ", bingo[i][j]);
	}
     System.out.println();
     }	
			
   }
}

43 16 24 10 40 
32 19  9 25 27 
 7 39 36 48  8 
22 45  4 44 30 
 3 14 41 49 37 

Discussion