正規乱数をボックスミューらー法で発生させて、
範囲を指定して出力したいと思ってます。
プログラムを作成してみたのですが・・・
平均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で質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
べき乗
-
面積や角度を出力するプログラム
-
doubleとintの違い
-
実数からの小数部の取得
-
0dの意味を教えてください
-
Javaで何パーセント%かを表示...
-
分を表す数値(int型)を、小数...
-
演算子を使わない演算
-
C言語のポインターに関する警告
-
オブジェクトの中のプロパティ...
-
ダブルクォーテーションのrepla...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
javaで質問です。 文字列2023/2...
-
Visual Basic でのコードをASCI...
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
ORA-01858: 数値を指定する箇所...
-
パソコンキーボードで時分秒を...
-
System.err. printlnとSystem.o...
-
getStringの値がNULLの時の処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実数からの小数部の取得
-
0dの意味を教えてください
-
Javaで何パーセント%かを表示...
-
べき乗
-
doubleとintの違い
-
分を表す数値(int型)を、小数...
-
乱数のdouble型について
-
double型変数値の整数部分のみ...
-
Double.parseDoubleの使い方
-
最大値と最小値の求め方
-
Javaによる利率計算の実装方法
-
double型の足し算について
-
Javaで計算
-
Java math.powメソッド
-
面積や角度を出力するプログラム
-
演算子 ^ は double,double に...
-
java のfor文について質問です。
-
JAVAのプログラムで、2乗計算...
-
掛け算演算を使わない掛け算
-
四捨五入をするメソッドを実装...
おすすめ情報