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

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

詳細はこちら
Java

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

Q&A

3回答

11810閲覧

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

sava

総合スコア6

Java

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

0グッド

0クリップ

投稿2017/05/28 09:52

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

・Math.random()を使うこと
・乱数は一文字ずつ配列に格納すること
を条件として提示されています。

list等は使わずにコードを書き換えるとしたらどうしたら良いでしょうか?
どうか皆さまのお力添えをお願いします。

###該当のソースコード
int[] ans = new int[4];
for (int i = 0; i < ans.length; i++) {
while (true) {
ans[i] = (int) (Math.random() * 10);
for (int j = 0; j < i; j++) {
if (ans[i] == ans[j])
continue;
}
System.out.print(ans[i]);
break;
}
}

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

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

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

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

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

koko_u

2017/05/28 10:01

なぜそんな縛りプレイをしているのですか?
sava

2017/05/28 12:03

いまいちlistの使い方がわかっていないというのが理由です…。
guest

回答3

0

何でもいいなら、Collections.shuffle() を使うのが簡単なのでは?

投稿2017/05/28 15:40

koko_u

総合スコア938

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

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

swordone

2017/05/28 15:50

List使っちゃいけないならそれも使えない…
koko_u

2017/05/28 15:56

使い方がわからないだけなら、覚えればよいと思ってな...
guest

0

こんな感じでしょうか?

Java

1int[] ans = java.util.stream.IntStream 2 .generate(() -> (int)(Math.random() * 10)) 3 .distinct().limit(4).toArray();

投稿2017/05/28 10:21

raccy

総合スコア21737

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

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

0

ヒント:continueの行き先は?

まずはコードをマークダウンしましょう。

java

1int[] ans = new int[4]; 2for (int i = 0; i < ans.length; i++) { 3 while (true) { 4 ans[i] = (int) (Math.random() * 10); 5 for (int j = 0; j < i; j++) { 6 if (ans[i] == ans[j]) 7 continue; // このcontinueが実行されたら次にどこに行く? 8 } 9 System.out.print(ans[i]); 10 break; 11 } 12}

###答え
continueはその地点から見て**最も内側のループ文(for,while)**に戻り、次のループに入ります。
つまり、2行前のfor (int j = 0; j < i; j++)に戻ります。
そしてこれはifに入ろうが入るまいが戻るので、実質このif文とcontinue文は無くても同じです。

このコードでやりたいのは、数字がダブったら数字の設定をやり直す、つまりwhile(true)に戻りたいのですよね?
なので、
0. while(true)にラベルを付けて、ラベル付きcontinueにする(あまりお勧めされない)
0. 数字が重複したかどうかのフラグを用意し、whileの継続条件をそのフラグの状態で判定する

のいずれかを取る必要があります。

また、このような重複を避けて選びたい場合、選ぶ候補を配列に用意してシャッフルし、先頭からいくつか(この場合4つ)選択するのが早くて確実です。
配列のシャッフルは意外に簡単に実装できます。「シャッフル アルゴリズム」で検索してみてください。

投稿2017/05/28 10:14

編集2017/05/28 12:47
swordone

総合スコア20669

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

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

sava

2017/05/28 12:02

breakせずに再度forを回す…ということだと思っていたのですがこの時点で間違っているのでしょうか…。 お手数でなければご説明頂けると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問