dポイントプレゼントキャンペーン実施中!

コマンドプロンプト上で、乱数をいくつか取得するというプログラムを作成したいのですが、コンパイル出来なくて困っています。発生させる乱数を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);
   }
}
}

A 回答 (5件)

コンパイル出来ない原因としては、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
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/07/22 23:49

とりあえず、コンパイルエラーの原因は


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"

ですね。
エラーメッセージは重要なので次からは
ぜひ提示してくださいね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/07/22 23:50

> ループさせる必要ないですか?



randを求めるのに、for文でループさせる事はない、という意味です。
しかも、1回しかループさせないのですから。
shiro-haseさんが回答されてるように、素直に、

rand = (int)(Math.random() * 10);

だけで良いのでは。
    • good
    • 0

こん**は。



まず、私の解答から。

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回出力されるはずです。
参考にして(なればですが・・・)試してみてください。

あと、次回から、できればコンパイルエラーの内容を教えてください。ご質問のプログラムのどこが悪いのか見つけられませんでした(泣)
よろしくお願いします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/07/22 23:47

for(int i=0; i<1; i++){


int rand = (int)(Math.random() * 10);
}

上記のコードだと、randはfor文のブロック内で新たに定義され、ブロック外部に影響を及ぼしません。
よって、このfor文を実行した後でも、randは0のままかと。

そもそも、ループさせる必要は、ないのでは?

この回答への補足

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

補足日時:2003/07/17 02:33
    • good
    • 0

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