![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
正規乱数をボックスミューらー法で発生させて、
範囲を指定して出力したいと思ってます。
プログラムを作成してみたのですが・・・
平均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ランキング
-
Javaで計算
-
C# ToStringでの数字桁揃えの仕方
-
Javaで何パーセント%かを表示...
-
double型の足し算について
-
java プログラム 範囲を指定し...
-
Double.parseDoubleの使い方
-
べき乗
-
1~100までの数字を表示し、か...
-
バイトスワップ
-
javaのプログラミングで作るRPG...
-
Javaには、構造体はないんですか?
-
C言語でunsigned char配列を連...
-
[JAVA]try 内の変数を外で!?
-
C言語 重複しない4ケタの乱数...
-
java キーボード入力された値の...
-
パソコンキーボードで時分秒を...
-
CSVファイルの、列だけ取得したい
-
Java言語 漢字とひらがなの判別
-
JPanelの重ね方/OverlayLayout他
-
インタフェイス実装と抽象クラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0dの意味を教えてください
-
べき乗
-
Javaで何パーセント%かを表示...
-
実数からの小数部の取得
-
double型変数値の整数部分のみ...
-
最大値と最小値の求め方
-
doubleとintの違い
-
double型の足し算について
-
少数50桁以上を表示するには
-
自然対数の底Eを含むStringの数...
-
Javaプログラムのフローチャー...
-
Java言語プログラミングについ...
-
printfでのエラーがわからない...
-
モンテカルロ法を用いた球の体...
-
Javaで計算
-
double型で収まりきれない小数...
-
フラクタルで雲を作る。
-
JAVAのプログラムで、2乗計算...
-
doubleで入力するには?
-
Javaのeval関数処理
おすすめ情報