![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
円周率πの値を求めたのですがNを大きくすると3.1415・・・に近づくはずですが、うまくいきません。どうすればいいのか検討がつきませんので、ご指摘お願いします。
float myrand()
{
float ans;
ans=(float)rand()/(RAND_MAX);
return(ans);
}
main()
{
int i,sum;
long N;
float ans,x,y,r,p;
srand((unsigned)time(NULL));
sum=0;
for(N=10;N<=1000000;N*=10){
for(i=10;i<N;i++){
x=myrand();
y=myrand();
r=x*x+y*y;
if(r<=1){
sum++;
}
}
ans=(float)(sum)/N;
p=ans*4;
printf("%d %f\n",N,p);
}
getch();
exit(0);
}
実行結果
10 0.000000
100 2.640000
1000 3.440000
10000 3.483600
100000 3.490640
1000000 3.491268
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?8acaa2e)
No.5ベストアンサー
- 回答日時:
このソースをよく検討してみると(見当ではありません)、以下の2箇所を直せばよいことがわかります。
おかしいのは、以下のところです。
sum=0; ・・ここでクリアしてはいけない。
for(N=10;N<=1000000;N*=10){
for(i=10;i<N;i++){ ・・i=10 ではなく、i=0とする。
従って、以下のようにします。
srand((unsigned)time(NULL));
for(N=10;N<=1000000;N*=10){
sum=0; ・・・・・・・・ここでクリアする
for(i=0;i<N;i++){ ・・・・i=0にする
上記のようにして実行してみて下さい。
ほぼ望んだ結果になります。
No.4
- 回答日時:
★アドバイス
>円周率πの値を求めたのですがNを大きくすると3.1415・・・に近づくはずですが、うまくいきません。
↑
擬似乱数を使っているので上手くいくときとそうでない場合があるからでしょう。
それかfloat型よりもdouble型の方が有効桁数が多い分だけ精度が出ませんか?
あるいはNをかなり大きくしないと精度がでないとか?
・私もちょっと作ってみました。
私は unsigned long long 型で試しました。
サンプル:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
// ベース定数
#define BASE 1000000000LL
// 擬似乱数
unsigned long long myrand( void )
{
return ((unsigned long long)rand() * rand() * rand() * rand()) % BASE;
}
// メイン関数
int main( void )
{
unsigned long N, pi, i, sum;
unsigned long long x, y, r;
srand( (unsigned)time(NULL) );
for ( N = 10 ; N <= 10000000 ; N *= 10 ){
for ( sum = i = 0 ; i < N ; i++ ){
x = myrand();
y = myrand();
r = (x * x) + (y * y);
if ( r < (BASE * BASE) ){
sum++;
}
}
pi = (sum * 4);
printf( "%8lu %lu\n", N, pi );
}
return 0;
}
実行結果(例):
10 32
100 332
1000 3148
10000 31364
100000 314236
1000000 3143132
10000000 31415956
4回実行したうちの1つです。
最初に実行した時間が精度が良かったみたいです。
覚えていませんが…。
No.2
- 回答日時:
ぜい肉を少しそぎ落としてみました。
ついでに、
× 検討がつきません
○ 見当がつきません
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
double myrand(void)
{
return (double) rand() / RAND_MAX;
}
int main(void)
{
int i, sum, n;
double x, y;
srand((unsigned) time(NULL));
for (n = 10; n <= 1000000; n *= 10) {
for(sum = i = 0; i < n; i++) {
x = myrand();
y = myrand();
if (x * x + y * y < 1.0)
sum++;
}
printf("%d %f\n", n, 4.0 * sum / n);
}
return 0;
}
(注)インデントのため、全角空白を使っています。
No.1
- 回答日時:
> for(i=10;i<N;i++){
このループの開始時にsumが0になっていません。
(なぜiが10から始まるのかも疑問だが。)
あと、Nがlongなのにiやsumがintでいいの?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# プログラミング実行後に表示される値を答えよ #include <stdio.h> void main 4 2022/05/28 10:20
- その他(プログラミング・Web制作) atcoder python コードへの助言 2 2022/08/12 15:31
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- 数学 paythonを使用した周回積分に関する質問です。 2 2023/02/17 19:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
行列をべき乗させるプログラム
-
for文の中にswitch文はいれられ...
-
C言語 プログラム
-
c言語のプログラムで
-
平均身長のプログラミング
-
getcの改行判定
-
C言語 数字以外を入力させない...
-
十進BASICのプログラムについて
-
円周率 πの値
-
C言語で、条件をつけて総和を求...
-
for文
-
VHDLで、case文とwhen文のどち...
-
c言語のリダイレクトによる円...
-
吸湿性のあるものを天秤で秤量...
-
2÷3などの余りについて
-
プログラミング初心者です。 Py...
-
printf で二進表示を行いたい。
-
マイナスからプラスへ転じた時...
-
【C言語教えてください】sin波...
-
O(n log n)について2
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
getcの改行判定
-
C言語階乗の総和を求める
-
配列を使って魔方陣
-
while文について、c言語...
-
プログラミングで二番目に大き...
-
C言語 数字以外を入力させない...
-
c言語のwhile文を使った計算で...
-
C言語プログラムが理解できなくて…
-
配列を関数に渡す方法
-
C言語で電卓を作成する。
-
C言語の二分法のプログラムにつ...
-
c言語for文
-
scanf関数を用いての加減乗除%...
-
階乗のプログラム!!
-
計算結果がlong型以上になる場...
-
初心者です。for文、if文を使っ...
-
c言語プログラミングで1から100...
おすすめ情報