
正規乱数をボックスミューらー法で発生させて、
範囲を指定して出力したいと思ってます。
プログラムを作成してみたのですが・・・
平均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]);
}
}
}
お願いします
No.3ベストアンサー
- 回答日時:
これは
if(50-2<s1[i]){
if(50+2>s1[i]){
のため48.0<s1[i]<52.0以外例えば
47.8や52.3のときはs[i]に0.0が代入
されているのですね。
なのでそれ以外のときは何を代入するかですが
単純に考えてその場合は出力しなければよいの
ですから
for(int j=0;j<150;j++){
if(s[j]!=0.0){//0でなければprintする。
System.out.println(s[j]);
}
}
No.4
- 回答日時:
こんにちは、
48~52の乱数、平均を50とすると、
1~5の乱数を作り、
47に加えれば良いのでは、ないでしょうか。
No.2
- 回答日時:
>たまに範囲外というか「0.0」が出力されてしまいます。
logやcosやsqrtは、定義域にない引数を渡すとエラーになります。
また、式の途中でオーバーフローが起こる可能性もあります。
その場合、
S=50+Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble()));
は実行されないか、Sはオーバーフロー値になります。
結果、
s1[i]=S;
も実行されず、s1[i]は初期値(0.0)のままになります。
なので、このままでは、たまに0.0が出ます。
S=50+Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble()));
を
S=0
S=Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble()));
S=S+50
にしてみましょう。0.0は出なくなります。但し、オーバーフローや値域エラーの場合にSは最終的に50.0になるので「50.0だけ少し多く出現する」と言う偏りが出ます。
偏りを無くすには、オーバーフローと値域のチェックを行いましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0dの意味を教えてください
-
最大値を求めるプログラム
-
実数からの小数部の取得
-
Javaで何パーセント%かを表示...
-
IF関数でEmpty値を設定する方法。
-
変数を動的に利用するには?
-
オブジェクトの中のプロパティ...
-
System.err. printlnとSystem.o...
-
16進数数字を結合して、10進数...
-
ループ処理の際、最後だけ","を...
-
javaで質問です。 文字列2023/2...
-
ORA-01858: 数値を指定する箇所...
-
【Java8以降】csvファイルの複...
-
大量のデータを読み込んで表示...
-
JSPやサーブレットでSystem.out...
-
C言語のポインターに関する警告
-
EXCEL VBA で、0から?1から?
-
java キーボード入力された値の...
-
テキストボックスに入力された...
-
Path型をString型へ変換する(Java)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0dの意味を教えてください
-
実数からの小数部の取得
-
べき乗
-
double型変数値の整数部分のみ...
-
Javaで何パーセント%かを表示...
-
Java math.powメソッド
-
doubleとintの違い
-
プログラムのおかしいところを...
-
ダイアログベースの3次Spline...
-
最大値と最小値の求め方
-
Javaによる利率計算の実装方法
-
掛け算演算を使わない掛け算
-
演算子 ^ は double,double に...
-
printfでのエラーがわからない...
-
javaで1.8x10の308乗÷...
-
オブジェクトの中のプロパティ...
-
System.err. printlnとSystem.o...
-
IF関数でEmpty値を設定する方法。
-
ループ処理の際、最後だけ","を...
-
動的配列が存在(要素が有る)か...
おすすめ情報