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

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

ただいまの
回答率

90.61%

  • Java

    13518questions

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

java 解釈

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 751
javaでコードを見てもどうしてこんなコードになっているかわからないものがあるので解釈を教えて下さい。

int[] answer = new int[3];//答えが入る
//ランダムな答えを作成
      //ただし同じ数字が無いようにする
      for (int i = 0; i < answer.length; i++) {
         //自分より前の要素にかぶる奴がないか確かめる
         //あったらもう1回random
      boolean flag = false;
      answer[i] = (int) (Math.random() * 6 + 1);
      do {
         flag = false;
         for (int j = i - 1; j >= 0; j--) {
          if (answer[i] == answer[j]) {
                        flag = true;
                        answer[i] = (int) (Math.random() * 6 + 1);
                    }
                }

            } while (flag == true);

これでどのようにしてかぶっている要素を見つけられるのでしょうか??

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

まず、answerの初期状態は、[0, 0, 0]です。
ランダム値はサイコロと同じ1~6のどれかになります。

外側のforループは、for (int i = 0; i < answer.length; i++)
なので、最初はanswer[0]にランダム値を入れます。
5が入ったとすると、answer[5, 0, 0]になります。
内側のループはfor (int j = i - 1; j >= 0; j--)ですが、
i = 0の時は最初の時点でj >= 0を満たさないので、
forループに入らずに進み、flag=falseのままなのでdo whileも抜けて
次に進みます。

次は、i = 1になるのでanswer[1]にランダム値を入れます。
4が入ったとすると、answer[5, 4, 0]になります。
内側のforループは、i = 1の時はfor (int j = 1 - 1; j >= 0; j--)
になりますので、1回だけ、つまり
自分より前の要素answer[0]とだけ同じかどうか確かめます。
この場合は54ですから、同じでないので、flag=falseのままになり、
do whileを抜けて次に進みます。

★目印

次は、i = 2になるのでanswer[2]にランダム値を入れます。
5が入ったとすると、answer[5, 4, 5]になります。
内側のforループは、i = 2の時はfor (int j = 2 - 1; j >= 0; j--)
になりますので、自分と自分より前の要素answer[1]answer[0]と順に確かめます。
この場合は、answer[2] == answer[1]は等しくありませんが、
answer[2] == answer[0]は等しいので、if文の中に入ります。
if文の中では、flag=trueにして、answer[2]にランダム値を入れます。
2が入ったとすると、answer[5, 4, 2]になります。
flag=trueになったので、doの次(「★目印」)に戻ってからもう一度同じことをします。

i = 3になると、外側のfor文の条件を満たさなくなりますので、ループが終了し
すべての計算が終了します。



長くなりましたが、このようにして、値がかぶらないようにしています。



ただ、正直あまり良いコードでは無いですね。
randomするところが2箇所にあったりループが複雑すぎる気がします。
例:
loop1:
for (int i = 0; i < answer.length;) {
    answer[i] = (int)(Math.random() * 6 + 1);
    for (int j = i - 1; j >= 0; j--) {
        if (answer[i] == answer[j]) {
            continue loop1; // かぶっていたら外側のループの最初に戻る
        }
    }
    i++; // かぶっていないときだけ次に進む
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/01/10 12:19

    実は for (int j = i - 1; j >= 0; j--)この処理がよくわからなかったのですが具体的な数値で考えるとよくわかりました。argius様のコードのほうが簡潔でわかりやすくて理解しやすかったです。回答ありがとうございました。

    キャンセル

0

do文内の以下のif文で、かぶっているかを判定しているようです。
if (answer[i] == answer[j]) { 
このときflagtrueを代入し、再度乱数を取得しています。
do文はflagが'false'のときに抜けるようになっているので、doを抜けると要素はかぶっていない状態です。

ご期待の回答でしょうか。

Setを使って、要素数が3になるまで、乱数をセットする方法はいかがでしょうか。
Set<Integer> answerSet = new HashSet<Integer>();
do {
    answerSet.put((int) (Math.random() * 6 + 1));
} while (answerSet.size() < 3);
int[] answer = ArrayUtils.toPrimitive(answerSet.toArray(new Integer[0]));

すみません、この方法ですと、Integerのハッシュなので、取得した配列は値の昇順になってしまいます。
HashSetではなく、LinkedHashSetを使うことで解決すると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/01/10 12:10

    迅速な回答有難うございました!!理解出来ました

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

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

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

  • 解決済

    コードの改良余地について。

    下記にあるコードは 四角形を9個作り、点が存在する四角形を青で塗り潰すコードなんですが、 一応これで思った通りに実行されます。 ですが、オブジェクト指向ではないような気がします。

  • 解決済

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

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

  • 受付中

    ループ化の方法

    public class Gohkaku {     public static void main(String[] args){         int math = ne

  • 受付中

    このコードをスマートにしてください

    aをb乗するプログラムを作成しております。 前回の質問で回答していただいた方々のおかげでとりあえずやりたかった動作をしてくれるプログラムは完成しました。 しかしこのプログラムを

  • 解決済

    クラス型配列のフィールドにアクセスしたいです。

    前提・実現したいこと サイコロが同じかどうかをチェックするプログラムです。 サイコロがn個与えられ、サイコロ各面に任意の数字が割り振られます。 サイコロDiceは_d[6]を

  • 解決済

    Java Hit&Blow

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

  • 受付中

    ランダムで重複しない配列

    前提・実現したいこと Java初心者です。 javaでヒットアンドブローを作る過程で ランダムで重複しない配列を作る必要があり、 以前こちらで見たコードを使おうと思ったので

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

  • Java

    13518questions

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