ページ 11

javaで配列

Posted: 2013年1月27日(日) 05:24
by daj
javaです
かぶらないように10個の整数を、乱数を使用して出力するプログラムを以下のようにして作ってみたのですが失敗しています。
確認したところ、while文中のif(check[t]==0)が実質if(check==0)の動きにしかなっていないようなのですが、
どのように変えれば作りたい通りに動いてくれるでしょうか?


import java.util.Random;
public class Syanhai {
public static void main(String[] args){
Random rand=new Random();
int[] check=new int[10];
int[] t=new int[10];
int i;
for(i=0;i<10;i++)
check=0;
i=0;
while(i<10){
t=rand.nextInt(10);
if(check[t]==0){
check++;
i++;
}
}
for(i=0;i<10;i++)
System.out.print("t[" + i + "] = " + t + "; ");
}

Re: javaで配列

Posted: 2013年1月27日(日) 09:22
by みけCAT
コードはコードタグで囲んでください。
このコードだとコンパイルエラーが出ませんか?

コード:

check[i]++;

コード:

check[t[i]]++;
にすればいいのではないですか?

Re: javaで配列

Posted: 2013年1月27日(日) 14:52
by daj
返信ありがとうございます。
凡ミス(?)ですね・・・

コンパイルですが、直す前のコードも、直した後のコードもeclipseで普通に動いていましたが、どこか気になる部分があったでしょうか?

Re: javaで配列

Posted: 2013年1月27日(日) 15:29
by h2so5
daj さんが書きました: コンパイルですが、直す前のコードも、直した後のコードもeclipseで普通に動いていましたが、どこか気になる部分があったでしょうか?
投稿する時に最後の}を忘れていませんか?カッコの数が合っていないのです。

Re: javaで配列

Posted: 2013年1月27日(日) 16:59
by daj
なるほど
投稿したコードは確かに}が足りなかったです
今後は気をつけます
ありがとうございました

Re: javaで配列

Posted: 2013年1月27日(日) 18:05
by かずま
そのアルゴリズムで、4 7 9 3 0 6 1 5 8 2 の乱数が得られたとしましょう。
最後の t[9] = 2 を求めようとして、rand.nextInt(10) を呼び出して
0~9 の乱数を発生させても、2 以外の値は check[] に引っかかって
欲しい 2 が出るまで何度も rand.nextInt(10) を呼び出すことになります。
t[8] を求める時も、残り 2つの値を得るために、rand.nextInt(10) を
何度も呼び出します。
10個の乱数全部を求めるのに、不定回数の乱数発生が必要で、
平均30回程度になるでしょう。

次のようにすれば、乱数発生は常に 9回で済みます。

コード:

import java.util.Random;

public class Syanhai {
    public static void main(String[] args){
        Random rand = new Random();
        int[] t = new int[10];
        int i;
        for(i = 0; i < 10; i++) t[i] = i;
        while (--i > 0) {
            int j = rand.nextInt(i + 1);
            int w = t[j]; t[j] = t[i]; t[i] = w;
        }
        for (i = 0; i < 10; i++)
            System.out.println("t[" + i + "] = " + t[i] + ";");
    }
}