🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

5回答

25618閲覧

javaで4桁のかぶらない数値の生成

next_door

総合スコア18

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

1クリップ

投稿2015/06/24 08:19

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
hoshito

総合スコア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

negiiro

総合スコア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

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

next_door

2015/06/24 11:13

ありがとうございました!無事できました! 他の方もいろいろなコードありがとうございました。勉強になりました。
guest

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
terushu

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、生成したランダム値が1000~9999であることをチェックします。
次に、HashSetを使って、セットに一回使った数値を格納して、次に生成したランダム値がセットにあるかどうかをチェックします。

HashSet (Java Platform SE 8 )

または、セットのサイズが4になるまでランダム生成を繰り返す、というのでも良いです。

投稿2015/06/24 08:31

編集2015/06/24 08:32
argius

総合スコア9394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問