4桁のかぶらない数値を配列に入れたいのですがwhileの後にどのような条件を書けばいいのかわかりません。
どうしたらいいでしょうか。
lang
1 2 public static void main(String[] args) { 3 int answer[] = new int[4]; 4 do{ 5 for(int i = 0;i > answer.length;i++){ 6 answer[i] = (int)(Math.random() * 9) ; 7 } 8 }while(); 9 10}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
全ての値が重複しないのを確認するメソッドを宣言して、whileの中に記載するのが一つ手かもしれません。
lang
1public static void main(String[] args) { 2 do { 3 // 省略 4 } while (check(answer)); 5} 6 7// 重複チェック 8public static boolean check(int[] arr) { 9 // 省略 10} 11
ところで乱数発生の回数は確定させた方が良いです。
実行する度に実行時間が変わるとなると品質として難ありとなってしまうからです。
さらに乱数発生の回数を少なくした方がより高速になる傾向があります。(可読性とのトレードオフになってしまうため、実運用上は必ずしも少ないほど偉いというわけではありませんが)
乱数発生を一回で要件を満たすコードを書いてみました。
(昔教わった方法なので、念のためmainメソッドは確認用のコードとなっています)
良かったらご参考下さい。
訂正)消したり書いたりたびたびすみません。「rand /= (10 - i);」が抜けていました。確認方法として、変数randに乱数ではなく実際に1〜720の値を入れることで確認することができます!
lang
1public class Test { 2 public static void main(String[] args) { 3 int[][] result = new int[4][10]; 4 for (int i = 0; i < 100000; i++) { 5 int[] arr = run(); 6 result[0][arr[0]]++; 7 result[1][arr[1]]++; 8 result[2][arr[2]]++; 9 result[3][arr[3]]++; 10 } 11 // 各桁での出現回数を確認 12 System.out.println(Arrays.toString(result[0])); 13 System.out.println(Arrays.toString(result[1])); 14 System.out.println(Arrays.toString(result[2])); 15 System.out.println(Arrays.toString(result[3])); 16 } 17 public static int[] run() { 18 final int FIGURE = 4; 19 int answer[] = new int[FIGURE]; 20 // 桁数FIGUREで, 取りうる値の総数を取得 21 int allNum = permutation(10, FIGURE); 22 // [0..9]のリスト 23 List<Integer> list = new ArrayList<>(); 24 for (int i = 0; i < 10; i++) { 25 list.add(i); 26 } 27 // [1..allNum]までの整数を取得(乱数生成は1回だけ) 28 int rand = (int)(Math.floor(Math.random() * (allNum + 1))) + 1; 29 for (int i = 0; i < FIGURE; i++) { 30 // 剰余によりlistのインデックスを決定 31 // randは (FIGURE - i) の倍数のため, 32 // 剰余として現れる値は同様に確からしい 33 int index = rand % (10 - i); 34 answer[i] = list.get(index); 35 list.remove(index); 36 rand /= (10 - i); 37 } 38 return answer; 39 } 40 // 順列計算 41 public static int permutation(int n, int k) { 42 int result = 1; 43 for (int i = 0; i < k; i++) { 44 result *= ( n - i ); 45 } 46 return result; 47 } 48}
投稿2015/06/24 10:34
編集2015/06/24 11:41総合スコア107
0
どうしてもdo - while節を使わなければならないならばこのようにするのはどうでしょう
lang
1 public static void main(String[] args) { 2 int answer[] = new int[4]; 3 Boolean isDuplicate=false; 4 do{ 5 /*4桁なので最初は0を除外*/ 6 answer[0]=(int)(Math.random()*9)+1; 7 /*残り3桁は0~9ランダム*/ 8 for(int i = 1;i < answer.length;i++){ 9 answer[i] = (int)(Math.random() * 10) ; 10 } 11 /*重複チェック*/ 12 isDuplicate=false; 13 for (int j=0;j < answer.length-1;j++){ 14 for (int k=j+1; k < answer.length;k++){ 15 if (answer[j]==answer[k]){ 16 isDuplicate=true; 17 } 18 } 19 } 20 } while (isDuplicate); 21}
投稿2015/06/24 09:37
総合スコア50
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
Math.random() * 9は9「未満」のdouble値になるので,9になりません.
かぶらない数値にするためには,値を入れた都度かぶってないかチェックするのがわかりやすいかと.
私ならこうしますね.
lang
1public static void main(String[] args){ 2 int[] answer = new int[4]; 3 for(int i = 0; i < answer.length; i++){ 4 Loop: while(true){ 5 answer[i] = (int)(Math.random() * 10); //0~9の数値を入れる 6 for(int j = 0; j < i; j++){ 7 //その前までの数値のどれかとかぶっていたら数値代入からやり直し 8 if(answer[j] == answer[i]) continue Loop; 9 } 10 break; 11 } 12 } 13}
投稿2015/06/24 08:35
総合スコア20669
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こういう方法もあります。
欲しい値が4つくらいなら上記の回答で十分ですが、大量のデータが欲しければ
lang
1int[] data = new int[9000]; 2for(int i = 0; i < 9000; i++){ 3 data[i] = i + 1000; 4} 5for(int i = 0; i < 1000; i++) //1000は適当、大きければよりランダムに羅列される 6{ 7 int a = (int)(Math.random() * 9000); 8 int b = (int)(Math.random() * 9000); 9 int d = data[a]; 10 data[a] = data[b]; 11 data[b] = d; 12} 13//この後に先頭のn個を取得
のように、最初から4桁ぶんのデータを用意してシャッフルするというのも手です。
手打ちコードなので動かない箇所があれば適宜修正願います。
投稿2015/06/24 09:14
編集2015/06/24 09:18総合スコア358
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
まず、生成したランダム値が1000~9999であることをチェックします。
次に、HashSet
を使って、セットに一回使った数値を格納して、次に生成したランダム値がセットにあるかどうかをチェックします。
または、セットのサイズが4になるまでランダム生成を繰り返す、というのでも良いです。
投稿2015/06/24 08:31
編集2015/06/24 08:32総合スコア9394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。