![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
モンテカルロ法を使って半径1のD次元球の体積Vを求めるプログラムを作成せよという課題が出ましたがまったくもって手を付けれないため質問させていただきます。
またプログラムの仕様は以下のようなものであることとして
・乱数を生成する関数は自ら作成するか、言語に標準で用意されているものを利用。
・次元の数D、点の数N、乱数の種SEEDは標準入力(キーボード)またはGUIで入力できること。
・求めた体積Vの値を出力すること。
が条件とされています、参考として以下のプログラムが与えられております。
import java.util.Random;
import java.io.*;
public class Circle{
public static void main(String[] args) throws IOException {
double x,y,ran;
String s;
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Input: random seed");
s = buf.readLine();
long seed = Long.parseLong(s);
System.out.println("Input: Number of trials");
s = buf.readLine();
long ntrial = Long.parseLong(s);
Random rnd = new Random();
rnd.setSeed(seed);
double r0=1.0;
double r02=r0*r0;
long nin=0;
for(int i=0; i < ntrial; i++){
ran=rnd.nextDouble();
x=ran;
ran=rnd.nextDouble();
y=ran;
double r2=x*x+y*y;
if(r2 < r02) nin=nin+1;
}
double area=4.0 * ((double)nin/(double)ntrial);
System.out.println("ntrial="+ntrial+" area= "+area);
}
}
どなたかお答えいただければと思います。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
座標原点との間の距離:
1次元 → √(x*x)
2次元 → √(x*x + y*y)
3次元 → √(x*x + y*y + z*z)
4次元 → √(x*x + y*y + z*z + w*w)
5次元以降略
この距離がD次元球の半径内に収まっているか否かの判定をすればいいだけです。平方根の計算を避けるために、元のプログラムでは距離を2乗した状態で大小比較をしています(r2とr02)。
ついでに、元のプログラムはran=rnd.nextDouble();のところをran=rnd.nextDouble()*r0;に直せば、r0の値を変更するだけで半径1以外の場合にも対応できますね。
No.3
- 回答日時:
>モンテカルロ法自体の理解が危うやで、
では理解してください。
>配列を用いたプログラム作成が現状分かっていない状態です。
昨夜No.2の回答を書いた後、配列を使わなくても書けることに気付きました。がんばってください。
学校か何かの課題なら、解くのに必要な情報は既に与えられているはずです。
No.2
- 回答日時:
まず、「モンテカルロ法」って何をするものが分かっていますか?
ran=rnd.nextDouble();
x=ran;
ran=rnd.nextDouble();
y=ran;
→ 2次元の場合はxとyの2軸ですが、D次元(Dは2以上の整数)の場合はxとyのような普通の変数ではなくて配列を使うのがいいでしょう。
double r2=x*x+y*y;
→ D次元空間の原点とある座標との間の距離の求め方が分かっていればこの式も書き換えられます。もちろん上に書いた配列を使います。
double area=4.0 * ((double)nin/(double)trial);
→ D次元の場合はこの係数も4.0ではなくなります。
ご回答ありがとうこざいます。
モンテカルロ法自体の理解が危うやで、配列を用いたプログラム作成が現状分かっていない状態です。
質問にあげましたサンプルプログラムは二次元の円面積を求めるものらしいのですがそれを書き変えることで求められる、とのことだったのですがさっぱり分からないというのが現状です
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- Ruby vscode 文字化け 1 2022/05/21 19:17
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
べき乗
-
実数からの小数部の取得
-
Javaで何パーセント%かを表示...
-
0dの意味を教えてください
-
最大値と最小値の求め方
-
double型変数値の整数部分のみ...
-
Javaによる利率計算の実装方法
-
doubleで入力するには?
-
doubleとintの違い
-
JAVAのプログラムで、2乗計算...
-
double型の足し算について
-
掛け算演算を使わない掛け算
-
実数 2.0 に対して int(2.0) ==...
-
Javaコンパイルエラー
-
java のfor文について質問です。
-
C# ToStringでの数字桁揃えの仕方
-
java プログラム 範囲を指定し...
-
Javaのeval関数処理
-
printfでのエラーがわからない...
-
数値積分について
おすすめ情報