JSPでdouble型の乱数を取得する方法と注意点

このQ&Aのポイント
  • JSPからMathクラスのrandomメソッドを使用してdouble型の乱数を取得する方法について解説します。乱数を取得する際に小数点以下が付いてしまう場合の対処方法もご紹介します。
  • JSPでdouble型以外の乱数を取得する方法とその注意点について解説します。コンパイルエラーが発生し、double型以外の乱数を取得できない場合の対処方法についてもご紹介します。
  • JSPで理想的な乱数を取得するための方法について解説します。乱数の小数点以下の桁数を制限する方法や、戻り値を文字型に変換して返す方法について詳しく解説します。
回答を見る
  • ベストアンサー

乱数の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
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • cucsna
  • ベストアンサー率23% (12/51)
回答No.3

#1の補足にで書かれていたコードを、少しいじってみたのですが、 以下のような形で目的通りにはなりませんでしょうか? (-50~50の整数が、String型に変換されて戻るはずだと思います。) 間接参照できませんというのは、 「if(rnd.length = 4)」で発生したのではないかと思いました。 私はJSPは使わないので、自信はありません。 public String getR(){ String _R; int max = 50 ; int min = -50 ; int rnd = (int)((Math.random() * (max - min + 1)) + min) ; _R = Integer.toString(rnd); if(_R.length() == 4){ _R = _R.substring(0,2); } return _R; }

jun2249
質問者

お礼

こんにちは。 できました!! ありがとうございます。 _R に先に代入してそれを使うようにすればいいんですね。 また、それによってランダム変数の(int)が効くようになり小数点以下が出ないようになりました。 これはJSPではなくjavaのクラスファイルなのですがJSPからこれを呼び出したかったのです。 ほんとにありがとうございました。

その他の回答 (2)

  • tajiri
  • ベストアンサー率45% (5/11)
回答No.2

Math.random()は0~1の間の値を返します。 開発者は自分のほしい範囲にするために定数をかけて 実際のランダム値として使用します。 例:0~100までのランダムだと100をかける。 doubleで帰ってくるのは開発者が求めるランダム値の 範囲がわからないため汎用的にするためdoubleに なっていると思います。 (小数点以下がいらない場合は切り捨ててしまえば 上位の桁だけでも数が大きければ範囲内での ランダム値となります)

jun2249
質問者

補足

ありがとうございます。 私も小数点以下を切り捨てればいいと思い、(int)やMath.floorを使ってもみましたがだめでした。

  • yutopapa
  • ベストアンサー率47% (139/295)
回答No.1

今、手元にJDKをインストールしたPCがないので試してないですが、 1. rndがdoubleなので、単にintでキャストしてやれば良いのでは? 2.キャストしたintをIntegerクラスに入れてやって、toString()で良いような。 細かいJavaの文法はイマイチ覚えていないのであやふやですが、多分いけると思います。 (手元にJava API JavaDocを置いておくべきですね。(^^;)

jun2249
質問者

補足

ありがとうございます。 下記のようにしてやってみましたが、コンパイルの時点でint型は間接参照できませんとなってしまいました。 public String getR(){  int max = 50 ;  int min = -50 ;  int rnd = (int)((Math.random() * (max - min + 1)) + min) ;  if(rnd.length = 4){   rnd = rnd.substring(0,2);   _R = rnd.toString();  }  else{   _R = rnd.substring(0,3);   _R = rnd.toString();  }  _R = "+" + _R ;  return _R; }

関連するQ&A

  • 高精度乱数関数

    rand()の値をRAND_MAX+1で割ると、[0, 1)の範囲になりますよね。 もし、RAND_MAX+1が2の乗数なら、浮動小数において結果は丸め誤差を含んでいないはずですよね。 unixのgccでコンパイルしたのですが、RAND_MAXの値は32767だったので、 #define (RM RAND_MAX + 1) #define RND ((long double)rand()) long double x; x = RND / RM + RND / RM / RM + RND / RM / RM / RM + RND / RM / RM / RM / RM ・ ・ ・; とすれば、精度の高い[0, 1)区間の乱数関数を作ることはできますか? この論理に間違いがあれば指摘してください。

  • 乱数を配列へ格納(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); // 取得した乱数を配列に格納。 } } }

  • 重複しない乱数を作り配列に入れる(AS3.0)

    Flash Pro CS5 AS3.0 で記述しています。 1~10の整数をランダムかつ重複せずに配列に格納したいと考えています。 そこで,ネット上で参考になるソースを見つけ, 以下のように書き直しました。 var int_a = new Array(); var int_b = new Array(); function RandomInt():void{ //ここだけ変更すればよい var maxN:Number = 10;//乱数の最大値 //0~maxNの数字を全部配列に入れる for (var i:int=0; i< maxN; i++) { int_a[i] = i+1; } var j:Number = 0; var a_length:Number = int_a.length; //要は配列をシャッフルする while (a_length) { var int_r:Number = Math.floor(Math.random()*(maxN+1-j)); //乱発生した整数を配列int_bに順番に入れ、int_aから削除する int_b[j] = int_a.splice(int_r, 1); j++; //配列int_a内の数字が一つずつ減っていく a_length = int_a.length; } //ここで配列int_bがシャッフルされた trace(int_b); } RandomInt(); としました。 しかし出力結果がなぜか 8,2,4,9,,7,6,5,10,3,1のように抜けている部分があり, 次のフレームで for(var j:int=1; j <= 10; j++){   trace(int_b[j]); } として確認してもやはり 2 4 9 7 6 5 10 3 1 となってしまします。 どの部分がおかしいのか教えていただきたいです。 また,乱数発生の部分で Math.floor(Math.random()*(maxN+1-j)); という風に記述してあったのですが,ここは間違いではないのでしょうか? jを引いていくと発生する乱数の範囲が徐々に狭くなっていってしまうと思ったのですが; それとも元のソースコードを使って ttp://www.renowan.com/blog/?p=143 0~9までの乱数を発生させてそれぞれに1を足す方が簡単でしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • JavaScriptを使ってロト6の当選数字を予想するプログラムを考えたのですが・・・

    Math.floor(Math.rondom()*10);を使うと、小数点以下の数字を出さない。 と先生に教えられたのですが、 ((Math.floor(Math.random() * 10)) + (Math.floor(Math.random() * 10))) * (Math.floor(Math.random() * 10)) + 1; を変数に入れて、テキストボックスに出力してみると、なんと小数点が出てしまいます! しかも、27.5や59.5などと、ちょうど0.5が出てしまいます。 この0.5を出さないように、ランダムで数字を出したいのですが、Math.floor以外で使えるものがあったら教えてください。 よろしくお願いします。

  • 乱数で同じものが出ない処理ってどうやるんですか?

    .NETでタイピングゲームを作っています。 乱数を使って日本語とそのローマ字を1セットとして表示していくプログラムなんですが、どうしても同じものが出てしまうのですが、同じ日本語とローマ字のセットが表示されないようにするにはどうすればよいでしょうか? ちなみに、コード下記のように作りました。 Randomize() 乱数 = Math.Floor(Rnd() * 要素数) + 1 If 乱数 Mod 2 = 0 Then '乱数が偶数の時 Label1.Text = Typeword(乱数 - 1) '日本語表示 Label2.Text = Typeword(乱数) 'ローマ字表示   elseで、乱数が奇数の処理を行う。

  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

  • java プログラム 範囲を指定した乱数

    正規乱数をボックスミューらー法で発生させて、 範囲を指定して出力したいと思ってます。 プログラムを作成してみたのですが・・・ 平均50で範囲を48から52にしたいのですが たまに範囲外というか「0.0」が出力されてしまいます。 アドバイスをください import java.util.*; public class test2{ public static void main(String args[]){ double R,S; double r[]=new double[200];  double s[]=new double[200]; double s1[]=new double[200]; Random ran=new Random();    for(int i=0;i<200;i++){     R=ran.nextDouble(); S=50+Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble())); r[i]=R; s1[i]=S; if(50-2<s1[i]){ if(50+2>s1[i]){ s[i]=s1[i]; } } } for(int j=0;j<150;j++){ System.out.println(s[j]); } } } お願いします

    • ベストアンサー
    • Java
  • 乱数の重複無しを作りたい

    先回質問させていただき、乱数発生は教えてもらいわかりました。 <html><head><title>乱数発生器</title></head> <body> 1~150の乱数を発生させます。<br> <input type="button" value="発生させる。" onclick="alert( Math.floor( Math.random() * 149 ) + 1 )"> </body></html> これで今まで出た数字は出ないよう(重複しない)ようにしたいです。 どのようにすればいいのでしょうか? 出来れば上記コードふまえたコードを書いていただけると幸いです。 (すみません。JAVA初心者なのでどこに書いたらいいかわかりません) 目的はビンゴゲームのようなくじに使いたいと思います。 ですから人数はその会場に行かないとわからないので、MAXの数字は 自分で書けるようにしたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ActionScript 初心者です。Math.floorについて

    すみませんが教えて下さい。 参考書より 「-10~10までの範囲の整数値」であれば、小数部分を切り捨てるMath.floor()メゾットを使って「Math.floor(Math.random()*21)-10」となります。 Marh.random()が0だと「Math.floor(Math.random()*21)」の部分は「Math.floor(0*21)」となり0になります。 つまり「Math.floor(Math.random()*21)-10」の最小値は-10になります。 Math.random()が約1だと「Math.floor(Math.random()*21)」の部分はMath.floor(1*21)となり、約21(20.99999999・・)の少数部分を切り捨てて20になります。したがって「Math.floor(Math.random()*21)-10」の最大値が10になることが分かります。 とありますが、いろいろ調べても概念がさっぱりわかりません。 詳しい方、噛み砕いて教えて頂けるととてもありがたいです。 こんな質問ですみません。よろしければよろしくお願い致します。

    • ベストアンサー
    • Flash
  • 正規乱数がうまく使えない

    正規乱数をつかってプログラムを組みたいのですが staticでないメソッドnextGaussian()をstatic コンテキストから参照することはできません というエラーが出てコンパイルできません。 public class sample{ public static void main(String[] args) { int n = 10; double z[] = new double[2*n]; for(int i = 0; i<n; i++){ z[2*i ] = Random.nextGaussian(); z[2*i+1] = Random.nextGaussian();} } } 申し訳ないのですがお手上げなので原因と解決法を教えて いただければと思います。よろしくお願いします。

専門家に質問してみよう