rap*_*cil 0 c++ random estimation pi
我是C++的新手.我正在尝试使用计算机系统的随机数生成器基于Ernesto Cesaro的定理来统计确定Pi的值.但我现在所做的可以输入种子数并生成100个伪随机数,然后估计pi的值.生成器可以生成不同组的伪随机数.然而,令人困惑的是我总是得到2.8284的pi估计而没有变化.这是代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
注意,Cesaro定理表明,给定两个随机整数x和y,gcd(x,y)= 1的概率为6 /(Pi ^ 2).并且使用的PRNG影响得到的估计与Pi的接近程度(3.1416).
您的代码有几个问题.
问题#1:
if (n = 1)
Run Code Online (Sandbox Code Playgroud)
它应该是if (n == 1)
要不你分配1
到n
和总为真.
问题#2:
n = r;
} while (r != 0);
if (n == 1)
Run Code Online (Sandbox Code Playgroud)
如果你考虑一下,循环只会在r
is 时结束0
,但是n
也会0
因为循环的最后一行而结束.所以n
永远不会等于1
.你可能想要if (m == 1)
.
问题#3:
for (j = 0; j < 100; j++)
{
...
j = j + 2;
Run Code Online (Sandbox Code Playgroud)
你是递增j
的for
行和循环体.你只需要一个.
for (j = 0; j < 100; j += 2)
{
//no j increment
Run Code Online (Sandbox Code Playgroud)
问题#4:
p = 300 / sum;
Run Code Online (Sandbox Code Playgroud)
这是一个整数除法,因为这两个数都是整数.你想要煽动点:p = 300.0 / sum;
.
随着这些变化,我正在谈论3.16
.