java 解釈
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 1,226
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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]
とだけ同じかどうか確かめます。
この場合は
5
と4
ですから、同じでないので、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++; // かぶっていないときだけ次に進む
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
do
文内の以下のif
文で、かぶっているかを判定しているようです。
if (answer[i] == answer[j]) {このとき
flag
にtrue
を代入し、再度乱数を取得しています。
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を使うことで解決すると思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2015/01/10 12:19