電子書籍の厳選無料作品が豊富!

現在、JAVAの入門書にてプログラムの勉強中です。
その書籍に掲載のプログラムコードがどうしても意図する結果に
なりません。入力間違いなどのミスはないか何回も見直しましたが、
どこも入力間違いは見当たりません。
何が原因か教えて頂けますでしょうか。

実行例がこのようになります。
数字は例なのでこの限りではありません。

要素数 : 7
a[0] = 7
a[1] = 5
a[2] = 1
a[3] = 2
a[4] = 9
a[5] = 6
a[6] = 3

プログラムコードが下記になります。
/*配列の全要素を1から10の乱数で埋め尽くす
(すべての要素が重複しないようにする*/

01: import java.util.Random;
02: import java.util.Scanner;
03:
04: class ArrayRandY {
05:
06: public static void main(String[] args) {
07: Random rand = new Random();
08: Scanner stdIn = new Scanner(System.in);
09:
10: int n; //要素数
11: do {
12: System.out.print("要素数 : ");
13: n = stdIn.nextInt(); //要素数を読み込む
14: } while (n > 10);
15: int[] a = new int[n]; //配列を生成
16:
17: for (int i = 0; i < n; i++) {
18: int j = 0;
19: do {
20: a[i] = 1 + rand.nextInt(10);
21: for ( ; j < i; j++)
22: if (a[j] == a[i]) break;
23: } while (j < i;);
24: }
25:
26: for (int i = 0; i < n; i++) {
27: System.out.println("a[" + i + "] = " + a[i]);
28: }
29: }
30:}
以上です。

これを
javac ArrayRandY.java → java ArrayRandY
とやると、重複しない結果のときもありますが
重複する値が出てしまうときもあります。

著者のホームページの正誤表を見たのですが情報がありませんでした。
常にこのプログラムの配列の全要素を重複しないようにするには
どうしたらよろしいでしょうか。

よろしくお願いいたします。

ちなみに、プログラムコードですが、入力画面ではインデントを
入力しているのですが確認画面ではなぜかインデントが表現
されてません。
大変見苦しいことお詫び申し上げます。

A 回答 (2件)

21行目のfor文の中でjが初期化されていないので、配列をチェック出来ない場合が出てきます。



i=3だとして
 a[0] = 1
a[1] = 2
a[2] = 3

とあって、1回目に取得した値が2、2回目に取得した値が1だった場合、jは1回目のチェックでインクリメントされて1になったままなので、2回目のチェックはa[1]から始めることになります。a[0]はチェック対象外となってしまいます。
なので、2回目はa[1]とa[2]だけチェックして同じ値が無いと判断されてしまいます。
    • good
    • 0
この回答へのお礼

>zionicさん
解決できました。
具体的に説明していただきわかりやすかったです。
ありがとうございました。

お礼日時:2009/07/05 09:37

21 行目がおかしい.


とりあえず j を 0 で初期化すればいいはず.
    • good
    • 0
この回答へのお礼

>TACOSANさん
ありがとうございました。
参考になりました。
解決できました。

お礼日時:2009/07/05 09:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!