为什么在使用PRNG估算Pi时我总是得到2.8284?

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).

rod*_*igo 5

您的代码有几个问题.

问题#1:

if (n = 1)
Run Code Online (Sandbox Code Playgroud)

它应该是if (n == 1)要不你分配1n和总为真.

问题#2:

      n = r;
  } while (r != 0);
  if (n == 1)
Run Code Online (Sandbox Code Playgroud)

如果你考虑一下,循环只会在ris 时结束0,但是n也会0因为循环的最后一行而结束.所以n永远不会等于1.你可能想要if (m == 1).

问题#3:

for (j = 0; j < 100; j++)
{
    ...
    j = j + 2;
Run Code Online (Sandbox Code Playgroud)

你是递增jfor行和循环体.你只需要一个.

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.

  • @HaonanYang因为100是一个非常小的样本量来估算比例.尝试10k,100k甚至一百万. (2认同)