質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.47%

  • Java

    14142questions

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

  • Eclipse

    1714questions

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

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

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 10K+

next_door

score 14

4桁のかぶらない数値を配列に入れたいのですがwhileの後にどのような条件を書けばいいのかわかりません。
どうしたらいいでしょうか。

    public static void main(String[] args) {
    int answer[] = new int[4];
    do{
        for(int i = 0;i > answer.length;i++){
            answer[i] = (int)(Math.random() * 9) ;
    }    
    }while();
    
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+1

Math.random() * 9は9「未満」のdouble値になるので,9になりません.
かぶらない数値にするためには,値を入れた都度かぶってないかチェックするのがわかりやすいかと.
私ならこうしますね.
public static void main(String[] args){
    int[] answer = new int[4];
    for(int i = 0; i < answer.length; i++){
        Loop: while(true){
            answer[i] = (int)(Math.random() * 10);  //0~9の数値を入れる
            for(int j = 0; j < i; j++){
                //その前までの数値のどれかとかぶっていたら数値代入からやり直し
                if(answer[j] == answer[i]) continue Loop;
            }
            break;
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/24 20:13

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

    キャンセル

+1

どうしてもdo - while節を使わなければならないならばこのようにするのはどうでしょう
    public static void main(String[] args) {
    int answer[] = new int[4];
    Boolean isDuplicate=false;
    do{
        /*4桁なので最初は0を除外*/
        answer[0]=(int)(Math.random()*9)+1;
        /*残り3桁は0~9ランダム*/
        for(int i = 1;i < answer.length;i++){
            answer[i] = (int)(Math.random() * 10) ;
        }
        /*重複チェック*/
        isDuplicate=false;
        for (int j=0;j < answer.length-1;j++){
           for (int k=j+1; k < answer.length;k++){
              if (answer[j]==answer[k]){
                 isDuplicate=true;
              }
           }
        }
    } while (isDuplicate);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

全ての値が重複しないのを確認するメソッドを宣言して、whileの中に記載するのが一つ手かもしれません。

public static void main(String[] args) {
  do {
    // 省略
  } while (check(answer));
}

// 重複チェック
public static boolean check(int[] arr) {
  // 省略
}

ところで乱数発生の回数は確定させた方が良いです。
実行する度に実行時間が変わるとなると品質として難ありとなってしまうからです。

さらに乱数発生の回数を少なくした方がより高速になる傾向があります。(可読性とのトレードオフになってしまうため、実運用上は必ずしも少ないほど偉いというわけではありませんが)

乱数発生を一回で要件を満たすコードを書いてみました。
(昔教わった方法なので、念のためmainメソッドは確認用のコードとなっています)

良かったらご参考下さい。

訂正)消したり書いたりたびたびすみません。「rand /= (10 - i);」が抜けていました。確認方法として、変数randに乱数ではなく実際に1〜720の値を入れることで確認することができます!

public class Test {
       public static void main(String[] args) {
               int[][] result = new int[4][10];
               for (int i = 0; i < 100000; i++) {
                       int[] arr = run();
                       result[0][arr[0]]++;
                       result[1][arr[1]]++;
                       result[2][arr[2]]++;
                       result[3][arr[3]]++;
               }
               // 各桁での出現回数を確認
               System.out.println(Arrays.toString(result[0]));
               System.out.println(Arrays.toString(result[1]));
               System.out.println(Arrays.toString(result[2]));
               System.out.println(Arrays.toString(result[3]));
       }
       public static int[] run() {
               final int FIGURE = 4;
               int answer[] = new int[FIGURE];
               // 桁数FIGUREで, 取りうる値の総数を取得
               int allNum = permutation(10, FIGURE);
               // [0..9]のリスト
               List<Integer> list = new ArrayList<>();
               for (int i = 0; i < 10; i++) {
                       list.add(i);
               }
               // [1..allNum]までの整数を取得(乱数生成は1回だけ)
               int rand = (int)(Math.floor(Math.random() * (allNum + 1))) + 1;
               for (int i = 0; i < FIGURE; i++) {
                 // 剰余によりlistのインデックスを決定
                 // randは (FIGURE - i) の倍数のため,
                 // 剰余として現れる値は同様に確からしい
                 int index = rand % (10 - i);
                 answer[i] = list.get(index);
                 list.remove(index);
                 rand /= (10 - i);
               }
               return answer;
       }
       // 順列計算
       public static int permutation(int n, int k) {
               int result = 1;
               for (int i = 0; i < k; i++) {
                       result *= ( n - i );
               }
               return result;
       }     
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

HashSet (Java Platform SE 8 )


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こういう方法もあります。
欲しい値が4つくらいなら上記の回答で十分ですが、大量のデータが欲しければ
int[] data = new int[9000];
for(int i = 0; i < 9000; i++){
  data[i] = i + 1000;
}
for(int i = 0; i < 1000; i++) //1000は適当、大きければよりランダムに羅列される
{
  int a = (int)(Math.random() * 9000);
  int b = (int)(Math.random() * 9000);
  int d = data[a];
  data[a] = data[b];
  data[b] = d;
}
//この後に先頭のn個を取得
のように、最初から4桁ぶんのデータを用意してシャッフルするというのも手です。

手打ちコードなので動かない箇所があれば適宜修正願います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

  • 解決済

    java 解釈

    javaでコードを見てもどうしてこんなコードになっているかわからないものがあるので解釈を教えて下さい。 int[] answer = new int[3];//答えが入る

  • 解決済

    [Java初心者]1~6の数字を重複しないようにランダムに3つ表示させる方法

    題名のとおり1~6の数字の中から重複しないように3つ数字を取り出すという問題です。 自分が考えた回答は以下の通りなのですが、回答とかなり違うためあっているのかこれでいいのかもあまり

  • 解決済

    LPIC レベル1 exam101について

    パーミッションについての質問です。 翔泳社出版のLinux教科書 LPIC レベル1 スピードマスター問題集を使用しています。 138ページ問題6-6なのですが、 ------

  • 解決済

    続・クイズを作りたいのだがうまくいかない。

    クイズを作りたいのだがうまくいかない。 上の質問の続きです。argius様の返答を参考に作り直したところ、以下の構造になりました。 ・一つのクラスで一つの問題を扱う(Questi

  • 解決済

    Javaのwhile文、do while文を使って計算する方法

    プログラム初歩で勉強中のものです。 色々なサイトで調べてもなかったので初歩的な問題ですが、質問させていただきます。 for文の繰り返しは分かるのですが、while文、do wh

  • 解決済

    Java Hit&Blow

    Hit&Blowのコードです。 答えの4桁の数字が重複しないためのコードはどのように書けばいいのでしょうか? import java.util.Scanner; class

  • 解決済

    結果が表示されません

    System.out.println(d);が実行結果で表示されません。 プログラムのどこがダメなのでしょうか。プログラムとしては9進数を3進数にしたいなあと思っています。 p

  • 解決済

    while文を使ったべき乗を表示する問題

    「正の整数を1つ入力させ,それ以下の2のべ き乗の数をすべて表示しなさい」という問題を解いています。2のべき乗を計算させる部分のプログラムがわかりません…誰か教えてください。

同じタグがついた質問を見る

  • Java

    14142questions

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

  • Eclipse

    1714questions

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