• ベストアンサー

double配列を戻り値としたメソッド

最近Javaを始めたのですが、あまり知識がなく勘で書いているため今回配列の戻り値でつまずいてしまいました。 プログラムは一応VB,C#,Cをそこそこ書けるだろうといったレベルだと思っています。 問題はタイトル通りなのですが、Tryの中にdouble[] doubFuv = Hunx((int)intpara); として、Hunx(同じクラスにstaticで宣言)は単純に配列を引数分作ってrundi[i] = Math.random();とし、最後にそのままreturn rundiしています。 ここでHunx内でprintlnして実行を確認すると正常に配列に値がはいているのですが、戻り値を受け取った側のdoubFuvには配列の中の幾つかが欠落(本来は0~1までの乱数のはずが、全体の3割に0.0が混入)してしまうといった今まで出会ったことのない状態になっています。 おそらくスレッドで何かぶつかっているのだと思いロックしてみようかと思いましたが、その方法もわからず途方に暮れています。 解決のヒントでもいいので、よろしくお願いいたします。

  • adomi
  • お礼率45% (14/31)
  • Java
  • 回答数5
  • ありがとう数0

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

  • ベストアンサー
  • tgook
  • ベストアンサー率48% (96/198)
回答No.3

「戻り値に配列を返す」というのは記憶に無いため、「これが原因だ!」とは断言できませんが、参考URLの「戻り値として配列を返すメソッド」のコードと、No.1様のコードを比較すると、staticで宣言されたメソッドが、更にPublic宣言でされているか?というところが気になります。 staticの前にPublicを記述して再度試されてみては如何でしょうか? また、printlnで配列に正常に値が入っているとありましたが、 return rundi; の前で System.out.println(rundi); は試してみましたか?

参考URL:
http://d.hatena.ne.jp/nekochan_mama/20081016/1224160636

その他の回答 (4)

回答No.5

なるべく文章化せずにソースコードそのまま提示するようにしてください。極端に長いコードでない限り。 No.1で示したコードで合っていたようですが、まだ「printlnして実行を確認」したあたりのコードが分かりません。 No.1のコードに加えて、メソッドからreturnする直前と、メソッドから戻り値を受け取った直後にそれぞれ、  for (int i = 0; i < intpara; i++) {    System.out.println(i+" "+rundi[i]);  } を挿入してあるだけなら、絶対に(と敢えて断言しますが)数値が化けることはありません。 (乱数にバグがあったとしても欠落とは関係ありません) 欠落の原因となっているプラスアルファのコードがあるはずです。 決して根の深い問題ではないという予感がします。ベテランプログラマも逃れられない不治の病「ポカミス」かと。 ローカル変数ではない変数(メンバー変数)があって、他のスレッドからいじられているとか。 あるいは、意図したメソッドとは違うメソッドを呼んでしまっているとか。 メソッドがオーバーライド(継承したクラスによるメソッド置き換え)またはオーバーロード(引数パターンの違う同名メソッド)されていると、メソッド名が同じために取り違えのミスが起こりやすいです。

adomi
質問者

補足

返信が遅れてしまい申し訳ありませんでしたm(><)m いろいろ本などを漁って見たところ、JavaはCなどのように配列を引数として渡すとアドレス参照となり、 C#でいうref修飾子が適応されたみたいな状態になっていました。 そこで引数を一回コピーして処理をしてみるとすべて正常に走ることができました! 協力してくださった皆さんにはとても感謝しております。 ご指導ありがとうございましたm(_ _)m

回答No.4

/** double配列の戻り値が欠落しないJavaプログラム java version "1.5.0_18" 以下のサイトによると、「以前のバージョンの Java では」結果が異なることもあったらしいです。 http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Random.html#nextDouble() ただ、最新のJDKでも同じ症状だとすると、後はソースを提示してもらわないことには、いやはや何とも・・・。 */ public class DoubleArray{  double[] doubFuv;  DoubleArray (double intpara){   try{    doubFuv = Hunx((int)intpara);   }catch(NumberFormatException e){    System.out.println("えらー、はっせい!!");   }  }  double[] Hunx(int int_param){   double[] rundi = new double[int_param];   for (int i = 0; i < int_param; i++) {    rundi[i] = Math.random();    System.out.println("rundi[" + i + "]→" + rundi[i]);   }   return rundi;  }  public static void main(String[] args){   DoubleArray da = new DoubleArray(5.0);   int i = 0;   for(double dF : da.doubFuv){    System.out.println("doubFuv[" + i + "]→" + dF);    ++i;   }  } }

参考URL:
http://www.techscore.com/tech/J2SE/Thread/5-2.html
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

たぶん私では役に立たないと思いますが, 可能ならその問題が発生する簡単なコードを出してもらえないでしょうか?

回答No.1

謎です・・・ static double[] Hunx(int intpara) {   double[] rundi = new double[intpara];   for (int i = 0; i < intpara; i++) {     rundi[i] = Math.random();   }   return rundi; } のようにメソッド定義して、 double[] doubFuv = Hunx((int)intpara); と呼び出しているということでしょうか? だとすると、ロックするまでもなく、他のスレッドからdouble配列をいじることは不可能です。(意図的に他のスレッドに受け渡す前の時点では) double配列はメソッド内でもメソッド外でもローカル変数ですから。 「printlnして実行を確認」この確認部分がバグっている可能性はありませんか? 欠落していない箇所はメソッド内外で同じ値を保っていますか? 乱数ではなく規則的な数列、たとえば 0,1,2・・・という連番を入れたらどうなりますか? というか規則的な数列を入れたほうがデバッグしやすいと思います。

adomi
質問者

補足

まさにそのプログラムのままです。 私もなぜこのようなことが起こるのか不思議でなりません、、、 環境はMac os x gccとなんら変わらない環境で、一回メモリ関連かとも思い再起動も何回も試しましたが一向に治りません。 欠落する数値も不規則で、法則もありませんでした・・・。 配列生成のメソッドでのforeachをかけた時の配列は正常 0.23462474245 0.72462346246 0.62462534566 0.23463464636 配列を受け取った側(Mainなど) 0.0 0.72462346246 0.62462534566 0.0 といった感じになります。 この0.0は表示不良でもなく、配列にしっかり0.0と入っていて、本当に謎です

関連するQ&A

  • 乱数を発生させて、それを配列して小さい順に並べる

    乱数の発生のさせ方は、質問集で見て import java.util.Random; class ransuu { public static void main(String args[]) { Random rand = new Random(); for ( int i = 0; i <10; i++){ int x = rand.nextInt(9); System.out.println(x); } } } を用いて表示できたのですが、そのあとの配列がよく分かりませんのでぜひ教えてください。ちなみに私の持っているテキストには任意の数(22、80、57、60、50など)を並べ替えるというものはあるのですが、今回のような乱数+配列の例が載っていないのでよく分かりませんでした。

    • ベストアンサー
    • Java
  • 配列の乱数と平均値、個数表示

    0から9までの整数乱数を100個発生させ、100個の乱数の平均値も合わせて出力し、0から9それぞれの個数を数えるための変数に必ず配列を用いるプログラムを下記に作成したんですけども、出現個数カウント用の変数を10個用意していけないという条件で出現個数カウント用の配列を用意し、 結果が、 7 7 1 7 3 9 1 2 5 0 0 3 6 8 4 9 1 4 2 4 8 2 4 2 6 0 9 3 5 8 6 6 6 2 0 9 5 2 6 9 5 0 5 3 9 2 6 7 0 6 1 4 1 1 1 9 7 0 5 0 6 9 7 4 9 9 7 5 3 6 1 9 6 6 6 7 1 2 6 1 4 9 1 3 1 3 7 0 0 8 1 9 3 2 9 4 4 5 4 0 0 *********** 11 1 ************* 13 2 ********* 9 3 ******** 8 4 ********** 10 5 ******** 8 6 ************** 14 7 ********* 9 8 **** 4 9 ************** 14 平均 4.4 に表示されるプログラムがわかりません、Java初心者なので作ったプログラムのどこを直せばいいのか教えてください。 class Kadai06_5 { public static void main(String args[]) { int n=10; int a[] = new int[n]; int i; int sum=0; double avg=0; for(i=0; i<100; i++){ System.out.print((int)(Math.random()*10)); sum +=(int)(Math.random()*10); } for(i=0; i<n; i++){ System.out.println(); } avg=(double)sum/100; System.out.println("平均"+avg); } }

    • ベストアンサー
    • Java
  • 乱数のdouble型について

    JSPから下記のクラスファイルを呼び出し、戻り値を返すように作りたいのですがうまくいきません。 1.Math.floor(Math.random()*100)-50 上記で実行しても小数点以下がでてしまいます。 出ないようにするのは無理なのでしょうか? 2.乱数はdouble型以外だめなのでしょうか? コンパイルするとdouble型なので間接参照できません。というようなエラーが出てしまいます。 これは結果を文字型に変更して戻り値として返したいのですができません。 どうすれば理想どおりにできるようになりますか? public String getR(){  double rnd = Math.floor(Math.random()*100)-50;  if(rnd.length = 4){   rnd = rnd.substring(0,2) ;  }  else{   rnd = rnd.substring(0,3) ;  }  _R = rmd;  return _R; }

    • ベストアンサー
    • Java
  • 乱数を配列へ格納(JavaScript)

    乱数を重複しないよう8個配列へ格納したいのですが、 格納の時点でエラーが発生します。 「オブジェクトでサポートされていないメソッドまたはプロパティです」 なぜでしょう? どなたかご教授下さい。 numbers = new Array(); // 空の配列宣言。 function make() { while(numbers.length < 8){ check = true; number = Math.floor(Math.random() * 100);// ランダムに0~99までの整数を取得。 for(i = 0; i < numbers.length; i++) { // 今取得したものと同じ乱数がないか、 if(number == numbers[i]) { // 配列の中身全てと比較。 check = false; } } if(check) { numbers.push(number); // 取得した乱数を配列に格納。 } } }

  • Javaコンパイルエラー

    Javaにて以下のようなプログラムを作成していますが、 「演算子 ^ は引数の型 double, int で未定義です。」とエラーになりました。 色々な方のご協力もあり、ここまで作れましたが、 これより先が行き詰っています。 教えていただけないでしょうか。 ---------------------------------------------- // 分散を返すメソッド public class Kadai16 { public static void main(String args[]){ //double型の配列の生成 double[]a=new double[10]; argument(a); //配列aの要素[0]から[9]の内容を表示 System.out.println(a[0]); System.out.println(a[1]); System.out.println(a[2]); System.out.println(a[3]); System.out.println(a[4]); System.out.println(a[5]); System.out.println(a[6]); System.out.println(a[7]); System.out.println(a[8]); System.out.println(a[9]); //double total=sum(a)を実行する double total =sum(a); System.out.println("合計は"+total+"です。"); //使って平均を出す double heikin; mean(total); heikin = mean(total); System.out.println("平均は"+heikin+"です。"); //分散を返す double bunsan; bunsan = total-heikin^2/10; System.out.println("分散は"+bunsan+"です。"); } /** * ランダムな数値を入れるメソッド * @param a ランダムな数値を入れる配列 */ private static void argument(double[]a) { //引数の配列aの[0]から[9]までランダムな数値を設定する。 for(int i=0; i<a.length;i++) { a[i]=Math.floor(Math.random()*10); } } //配列を受け取って要素の合計を出すメソッド public static double sum(double[] x) { double t=0; for(int i=0; i<x.length;i++) { t= x[i]+t; } return t; } //配列を受け取って平均を出すメソッド public static double mean(double b) { return b/10; } //分散を返すメソッド public static double bunsan(double c) { double t=0; double bnsan =0; for(int i=0; i<c.length; i++) { t =c[i]+t } } }

  • 配列で負数がない場合-1を戻り値に設定する

    こんにちは、JAVAプログラミング初心者です。 問題 private static int indexOfFirstNegativeNumber(int[] intArray)のメソードを使って配列の中にある一番初めの負数のインデックスナンバーを表示、負の数が無ければ戻り値は-1 public class assingment7 { public static int x; private static int indexOfFirstNegativeNumber(int[] intArray) { for (x=0;intArray[x]>0 ; x++) { } return x ; } public static void main(String[]args){ // Testing indexOfFirstNegativeNumber System.out.println("Testing indexOfFirstNegativeNumber\n"); int[] testIntArray = {1, 13, -5, 0}; System.out.print("Test array is: " ); for (x=0; x < testIntArray.length; x++) { System.out.print(testIntArray[x] + " "); } System.out.println("\nIndex of first negative number returns: " + indexOfFirstNegativeNumber(testIntArray)); System.out.println("\n***************************"); } } 結果 *************************** Testing indexOfFirstNegativeNumber Test array is: 1 13 -5 0 Index of first negative number returns: 2 *************************** 最初の負数がはいっているインデックスを表示する事はできたのですが、数字が全部負数でない場合-1を返すというやり方がいろいろ試してみましたか頭がこんがらがるだけで、できませんでした。アドバイスよろしく願いします!

    • ベストアンサー
    • Java
  • 自分で作ったクラスのメソッドから、配列が返ってこない

    こんばんは。 自分で作ったクラスのメソッドで、戻り値が配列のメソッドがあります。そのメソッドをメインプログラムから呼び出しても、値が入っていません。(空の配列が返ってくるのか、配列が返されているのかも分かりません)実行時エラーは以下の通りです。 Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:23) ソースコードは以下の通りです。 以下はメインプログラム // 自分で作成したクラスを使用しています DataProperty dp = new DataProperty( args[0] ); // ここで配列に値を入れています。 int[] intByteSize = dp.getByteSize(); System.out.println( intByteSize[0] ); 以下は自分で作ったプログラムです。 public int[] getByteSize() { if( fileNumber.equals("2004") ) { int[] intByteSize = { 8, 1, 5, 50, 8, 1, 15, 15, 3, 3, 8, 8, 11, 9, 7, 7, 1 }; return intByteSize; } 本などを見ても、構文的に間違いはないと思うんですが。。 だれか、原因の思いつく方は解答をください。よろしくお願いします。

    • ベストアンサー
    • Java
  • コンパイルできません。

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

    • ベストアンサー
    • Java
  • c言語の配列操作

    c言語で、hairetu[8][8]があったとして、その中でいくつかの中に1が入っていて、そのほかは0が入っているとします。 0 1 2 3 4 5 6 7 0|1 0 0 0 1 1 1 0 1|1 0 0 0 0 0 0 1 2|0 1 1 0 1 0 1 1 3|・・・・・・・・・・・・ 4|・・・・・・・・・・・・ 5| 6|・・・・・・・・・・・・ 7|0 1 1 0 0 0 0 1 という具合です。 そのとき、ランダムで1を1箇所しかない状態にしたいのですが、 自分が考えた方法だと無駄が多いので、もっとスマートな方法はないかと思い質問させてもらいました。基本的な質問なのですがよろしくお願いします。 以下自分が考えた方法 [64][2]の配列を作成し、上記の[8][8]の配列をfor文で解析し、1が入ってるところの番号を配列[64][2]に格納する。 乱数を使い、ひとつだけ選択する。

  • クラスやメソッドが理解できません

    今javaを勉強中なのですが、クラスやメソッドで生きず待ってしまいました。 メソッドの定義は 戻り値の型 メソッド名(引数リスト) {  文;  ・・・ return 式;  } ですが、メソッドから返されえる値を戻り値といますよね?呼び出し元に値を返すってどういうことなのでしょうか? int getNum() { System.out.println("調べました") return num; } たとえば、上記のようなものですが。もしも、このメソッドを呼び出すと、”戻り値”が戻ってくるわけですが、これはgetNumという変数のなかに計算式が入っている?という考え方でいいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう