私はC ++を初めて使用します。コンピューターシステムの乱数ジェネレーターを使用して、アーネストチェザロの定理に基づいて円周率の値を統計的に決定しようとしています。しかし、私が今やったことは、シード番号を入力し、100個の疑似乱数を生成してから、円周率の値を推定することができます。ジェネレータは、さまざまな疑似乱数のグループを生成できます。ただし、混乱は、変更なしで2.8284の円周率の推定値を常に取得することです。コードは次のとおりです。
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int seed;
cout << "input a seed number: " << endl;
cin >> seed;
srand(seed);
int i, a[100];
for (i = 0; i < 100; i++)
a[i] = rand() % 100 + 1;
cout << "The generated random numbers are: " << endl;
for (i = 0; i < 100; i++)
cout << a[i] << "\t";
int m, n, j, r;
int sum = 0;
for (j = 0; j < 100; j++)
{
m = a[j];
n = a[j + 1];
j = j + 2;
do
{
r = m%n;
m = n;
n = r;
} while (r != 0);
if (n = 1)
sum = sum + 1;
}
double Pi, p;
p = 300 / sum;
Pi = sqrt(p);
cout << "The estimate value of Pi is: " << Pi << endl;
system("pause");
return 0;
}
Cesaroの定理は、2つのランダムな整数xとyが与えられた場合、gcd(x、y)= 1の確率は6 /(Pi ^ 2)であると述べていることに注意してください。また、使用されるPRNGは、結果の推定値がPi(3.1416)にどれだけ近いかに影響します。
コードにはいくつかの問題があります。
問題#1:
if (n = 1)
それはそうでなければif (n == 1)
、あなたが割り当て1
ていてn
、常に真であると評価しているはずです。
問題#2:
n = r;
} while (r != 0);
if (n == 1)
あなたが考えてみれば、ループが場合にのみ終了しますr
です0
が、その後n
もなります0
ので、ループの最後の行の。したがって、n
に等しくなることはありません1
。あなたはおそらく欲しいですif (m == 1)
。
問題#3:
for (j = 0; j < 100; j++)
{
...
j = j + 2;
あなたは増加しているj
中でfor
のラインとループ本体に。必要なのは1つだけです。
for (j = 0; j < 100; j += 2)
{
//no j increment
問題#4:
p = 300 / sum;
両方の数値が整数であるため、これは整数の除算です。フォーティングポイントが必要です:p = 300.0 / sum;
。
それらの変更で私は約を得てい3.16
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加