dポイントプレゼントキャンペーン実施中!

モンテカルロ法を使って半径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件)

座標原点との間の距離:


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以外の場合にも対応できますね。
    • good
    • 0

>モンテカルロ法自体の理解が危うやで、



では理解してください。

>配列を用いたプログラム作成が現状分かっていない状態です。

昨夜No.2の回答を書いた後、配列を使わなくても書けることに気付きました。がんばってください。
学校か何かの課題なら、解くのに必要な情報は既に与えられているはずです。
    • good
    • 0

まず、「モンテカルロ法」って何をするものが分かっていますか?



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ではなくなります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうこざいます。
モンテカルロ法自体の理解が危うやで、配列を用いたプログラム作成が現状分かっていない状態です。

質問にあげましたサンプルプログラムは二次元の円面積を求めるものらしいのですがそれを書き変えることで求められる、とのことだったのですがさっぱり分からないというのが現状です

お礼日時:2014/02/20 09:25

どうやって計算すればいいのかがわからんの?


それとも計算方法はわかるけど,プログラムに出来ないの?
それともそれ以外なの?

ちゃんとわかっている人なら,参考プログラムを与えられたら1分で完成するよ。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。

計算方法自体が危うやで現状この程度のプログラムの書き換えもできないというような形です

お礼日時:2014/02/20 09:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!