【发布时间】:2018-03-26 05:32:30
【问题描述】:
我正在尝试编写一个通过使用两个随机数互质的概率来近似 pi 的程序,即 6/pi^2 所以我应该能够将 pi 近似为 sqrt(6/probability) 但出于某种原因它不倾向于 pi,而是倾向于 3.912。我试过 rand() 函数,也试过 mersenne twister 随机数生成器,但它们都给了我相似的结果。这是怎么回事?这是我在 C++ 中的代码
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
srand(time(0));
int times;
cout << "enter number of times: ";
cin >> times;
for(int i = 0; i <= times; i ++)
{
double pi_approx, probability;
int num1, num2, number_of_coprime;
num1 = rand();
num2 = rand();
if(__gcd(num1, num2)>1)
{
number_of_coprime++;
}
probability = double(number_of_coprime)/double(i);
pi_approx = sqrt(6/probability);
cout <<100*i/times<< "% number of coprimes: "<< number_of_coprime << " pi approximation: " << pi_approx<<endl;
}
return 0;
}
【问题讨论】:
-
number_of_coprime未初始化并在错误范围内定义。 -
这个循环将运行
times+1次。 -
数字不是互质
if(__gcd(num1, num2)==1)吗? -
你真的应该打开警告...对于新项目,
-Wall -Wextra适合 gcc 和 clang,/W:4适合 Visual C.
标签: c++ math random probability montecarlo