⛳
プログラミング自主学習 DAY72 Collections.Shuffle
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