単位に必要なんです!//球の体積

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kuroka

単位に必要なんです!//球の体積

#1

投稿記事 by kuroka » 15年前

/* rand2.c */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
int i,n=10000000;
double x,y,z,sum=0.0;
srand((unsigned int)time(0));
for(i=0;i<n;i++){
x=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= x <= 1
y=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= y <= 1
z=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= z <= 1
if(x*x+y*y+z*z<=1.0) {sum=sum+1.0;} // 条件
}
printf("%f %f \n",sum/((double)n)*8., acos(-1.0)*4/3);
return 0;
}


球の体積をもとめるプログラムです
教授がヒントを出して、それを少しいじったたのが上のプログラムです
よければ確認、助言などをいただけたらありがたいです。

non

Re:単位に必要なんです!//球の体積

#2

投稿記事 by non » 15年前

何をどう確認、助言して欲しいのかわかりませんが、
>x=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= x <= 1
仮にRAND_MAXが 32767だとすると、
32767/(32767+1)なので < 1  ですから、
コメントにあるように
-1<= x <= 1 でなく
-1 < x < 1 ですね。

kuroka

Re:単位に必要なんです!//球の体積

#3

投稿記事 by kuroka » 15年前

説明が不足してしまって申し訳ありません。
実は、私自身なにをどうしていいのやらよくわかっていないのです。

/* rand2.c */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
int i,n=100000;
double x,y,sum=0.0;
srand((unsigned int)time(0));
for(i=0;i<n;i++){
x=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= x <= 1
y=-1.+2.0*(rand()/((double)RAND_MAX+1.0f)); // -1<= y <= 1
if(x*x+y*y<=1.0) {sum=sum+1.0;} // 条件
}
printf("%f %f \n",sum/((double)n)*4., acos(-1.0));
return 0;
}

これは教授(といっても専攻は物理)が示した円の面積のプログラムです。
これをいじって体積を求めるプログラムを書けというのが問題なんですが、
いじったモノが質問内容のモノです。
面積を求めるプログラムを書き換えて、体積を求めるプログラムにしたわけですが、
それが正解かどうか、不正解なら助言などを頂きたいと思って質問しました

non

Re:単位に必要なんです!//球の体積

#4

投稿記事 by non » 15年前

モンテカルロ法というアルゴリズムです。
通常は円周率を求めるために使うものです。

面積や、体積を求めるために使うのはなにか違うような気もしますが、
課題ならしょうがない。

先ほどのxやyの範囲のコメントも教授がそう示すなら、これもしょうがない。
答えが、出たのだからいいのでは?

たかぎ

Re:単位に必要なんです!//球の体積

#5

投稿記事 by たかぎ » 15年前

> 教授がヒントを出して、

単なるヒントなら無視してもよいでしょう。
要件が球の体積を求めるだけであれば...
#include <iostream>

const double r = 1.0;
const double π = 3.141592653589793;

int main()
{
  std::cout << 4.0/3.0*π*r*r*r << std::endl;
}
で十分です。
とりあえず半径は1.0にしていますが、必要に応じて適当に調整してください。

ちなみにモンテカルロ法を使うのであれば、rand関数には荷が重いので、メルセンヌツイスタ等に置き換えるべきです。
そこまでする必要はまったくないとは思いますが...

YuO

Re:単位に必要なんです!//球の体積

#6

投稿記事 by YuO » 15年前

> 通常は円周率を求めるために使うものです。
> 面積や、体積を求めるために使うのはなにか違うような気もしますが、

円周率は副産物です。
元となる面積や体積がわかる物体の中に求めたい物体をおき,その中にある確率を求めることで,求めたい物体のおおよその面積や体積をはかっています。

円周率は,式であるπr2や4πr3/3を知らないと計算できません。
日能研の「シカクいアタマをマルくする」2004年4月の問題が,丁度よい例になっています。
http://www.nichinoken.co.jp/column/shik ... _0404.html
これ自体は円周率を求めなさいとなっていますが,実験で得られるのは面積であり,その面積からの逆算で円周率を出しています。

今回の場合だと,一辺の長さが2の立方体に内接する球の体積 (=半径1の球の体積) を求めようとしています。
元のものは円の面積ですね。n/sumが確率で,4が元となる円に外接する正方形の面積になります。


> それが正解かどうか、不正解なら助言などを頂きたいと思って質問しました

提示されたプログラムは,体積を計算するプログラムに改良するというのが課題であるならば問題ないでしょう。
ただし,次回からは規約と注意事項にあるように,pre要素を使って字下げをしてください。

non

Re:単位に必要なんです!//球の体積

#7

投稿記事 by non » 15年前

>円周率は,式であるπr2や4πr3/3を知らないと計算できません。
ああ、そうですね。勘違いしました。

kuroka

Re:単位に必要なんです!//球の体積

#8

投稿記事 by kuroka » 15年前

皆様のご協力のおかげで
無事なんとかなりました、ありがとうございます

利用規約の点は見落としてしまい、結果として
御迷惑をおかけしてしまい申し訳ありませんでした

これからもまだまだ若輩ものですから
C言語の取得に全力を尽くしていく所存でありますので
ご協力のほどを頂けたら幸いです。

本当にありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る