• ベストアンサー

コンパイルできません。

コマンドプロンプト上で、乱数をいくつか取得するというプログラムを作成したいのですが、コンパイル出来なくて困っています。発生させる乱数を0~900までの数字の中から0~9個のうちのいずれかの個数だけ取得するようにしたいです。j< の所に変数を記述するのはダメなのでしょうか?わかる方いましたらお願いします。 import java.util.*; public class RandomTest{ int rand; public static void main(String[] args){    Random generator = new Random();    for(int i=0; i<1; i++){     int rand = (int)(Math.random() * 10);    }    for(int j=0; j<rand; j++){     int ran = (int)(Math.random() * 1000);       System.out.println(ran);    } } }

質問者が選んだベストアンサー

  • ベストアンサー
  • busybull
  • ベストアンサー率100% (1/1)
回答No.4

コンパイル出来ない原因としては、rand変数はstaticで宣言していないだと思います。 下記のURL([S011 Q-04])参照してください mos21さんのソースの場合、変数randを使おうとしたら、 まず、randの宣言をmainメソッドの中に移して、最初のループにrand対して、もう一度宣言しないようにします。もちろん、osamuyさん言ったように、for文でループさせる必要がないと思いますよ こういう風に import java.util.*; public class RandomTest{ public static void main(String[] args){ int rand; Random generator = new Random(); rand = (int)(Math.random() * 10); for(int j=0; j<rand; j++){ int ran = (int)(Math.random() * 1000); System.out.println(ran); } } } なら、OKだと思います。

参考URL:
http://www.gimlay.org/~javafaq/S011.html
mos21
質問者

お礼

コンパイルできました。ご丁寧な回答ありがとうございました^^

すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

とりあえず、コンパイルエラーの原因は 2回目のfor文の j < rand です。 スコープの概念は解かりますか? 変数の有効範囲というやつです。 一回目のfor文の中で定義している int rand = (int)(Math.random() * 10); この rand は、for文の中でのみ有効です。 つまり、for文のスコープを抜けると、randはもう使えなくなってしまいます。 でここで混乱するのは、 2回目のfor文の j < randですね。 これは正確に書くと、 j < this.rand です。 Static関数からはインスタンス変数にアクセスできないので、 コンパイルエラーとなります。 解決案はすでに出ているとおりで、 int rand を main関数のトップで定義して、 フィールド変数の rand は消してしまいましょう。 フィールド変数を使いたいのであれば、 static int rand; と定義すればOKです。 ちなみに、ソースをそのまま動かした際の、エラーコードは、 static 参照は非 static フィールド rand ではできません。 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:274) at Hoge.main(Hoge.java:3) Exception in thread "main" ですね。 エラーメッセージは重要なので次からは ぜひ提示してくださいね。

mos21
質問者

お礼

わからなかったです。勉強になりました^^ありがとうございました。

すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

> ループさせる必要ないですか? randを求めるのに、for文でループさせる事はない、という意味です。 しかも、1回しかループさせないのですから。 shiro-haseさんが回答されてるように、素直に、 rand = (int)(Math.random() * 10); だけで良いのでは。

すると、全ての回答が全文表示されます。
回答No.2

こん**は。 まず、私の解答から。 int rand = (int)(Math.random()*10) for(int i=0;J<(9-rand);j++) { int ran = (int)(Math.random()*900) //プリント文 } では、いかがでしょうか。 for文の条件文に、変数を記述することは問題ありません。むしろ、よく使うようになると思います。 これで、randが3のとき、ranが7回出力されるはずです。 参考にして(なればですが・・・)試してみてください。 あと、次回から、できればコンパイルエラーの内容を教えてください。ご質問のプログラムのどこが悪いのか見つけられませんでした(泣) よろしくお願いします。

mos21
質問者

お礼

返信が遅れましてすいません。回答ありがとうございました。エラーの内容も記述するようにしますね(^^;

すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

for(int i=0; i<1; i++){ int rand = (int)(Math.random() * 10); } 上記のコードだと、randはfor文のブロック内で新たに定義され、ブロック外部に影響を及ぼしません。 よって、このfor文を実行した後でも、randは0のままかと。 そもそも、ループさせる必要は、ないのでは?

mos21
質問者

補足

ループさせる必要ないですか?コマンドプロンプト上でjava RandomTestと実行すると、0から900のあいだで数がランダムに出力するようにしたいのです(^^:1回実行すると3個(0から9のあいだでランダム)の数字(0から900のあいだでランダム)が出力されて、次の実行では7個というように(^^;

すると、全ての回答が全文表示されます。

専門家に質問してみよう