C言語関係掲示板

過去ログ

No.976 モンテカルロ法によるD次元球の体積Vを求める

[戻る] [ホームページ]
No.12646

モンテカルロ法によるD次元球の体積Vを求めるPG
投稿者---へこみぎみ君(2004/02/11 12:55:31)


こんにちわ
過去ログみましたが、モンテカルロ法による
D次元球の体積を求めるPGがわからなかったので
教えてください。

プログラムの仕様は以下のようなものです。
・ 次元の数D、点の数N、乱数の種SEEDは標準入力で入力できること。
・ 求めた体積Vの値を出力すること。

No.12649

Re:モンテカルロ法によるD次元球の体積Vを求めるPG
投稿者---たか(2004/02/11 15:18:35)


>こんにちわ
>過去ログみましたが、モンテカルロ法による
>D次元球の体積を求めるPGがわからなかったので
>教えてください。
>
>プログラムの仕様は以下のようなものです。
>・ 次元の数D、点の数N、乱数の種SEEDは標準入力で入力できること。
>・ 求めた体積Vの値を出力すること。

こんな感じでしょうか。標準関数rand()の性能があまり良くないので、
自前で乱数発生関数を作るのも手ですね。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define PI 3.1415926535897932384626

double montecarlo(int d, int n);
double hypersphere_volume(int n);
double fact(int n);

int main(void)
{
  int d, n;
  unsigned int seed;
  char dummy[100];
  double v, vv;
  
  printf("次元の数 D = ");
  scanf("%d", &d);
  printf("点の数 N = ");
  scanf("%d", &n);
  printf("乱数の種 SEED = ");
  scanf("%u", &seed);
  gets(dummy);
  
  srand(seed);

  v = montecarlo(d, n);
  vv = hypersphere_volume(d);

  printf("モンテカルロ法による体積 V = %fcm^%d\n計算による体積 V' = %fcm^%d\n", v, d, vv, d);
  
  return 0;
}

double montecarlo(int d, int n)
{
  int i, j, count = 0;
  double dist;
  
  for (i = 0; i < n; i++) {
    dist = 0;
    for (j = 0; j < d; j++)
      dist += pow((double)rand() / (RAND_MAX + 0.0001), 2);
    if (dist <= 1)
      count++;
  }
  return pow(2, d) * count / n;
}

double hypersphere_volume(int n)
{
  if ((n % 2) == 0)
    return pow(PI, n / 2) / fact(n / 2);
  else
    return fact((n - 1) / 2) * pow(2, n) / fact(n) * pow(PI, (n - 1) / 2);
}

double fact(int n)
{
  double res = 1;
  
  for (; n; n--)
    res *= n;
    
  return res;
}


No.12650

Re:モンテカルロ法によるD次元球の体積Vを求めるPG
投稿者---たか(2004/02/11 15:22:59)


そうそう、体積は便宜上(cm^n)と勝手に付けてますが、半径1cmの球とし
た時の体積ですので参考程度にして下さい。

No.12655

Re:モンテカルロ法によるD次元球の体積Vを求めるPG
投稿者---へこみぎみ君(2004/02/11 16:38:49)


>そうそう、体積は便宜上(cm^n)と勝手に付けてますが、半径1cmの球とし
>た時の体積ですので参考程度にして下さい。


ありがとうございました。
参考にさせていただきます。