voidmethod_1(int N) { double x, y, hits = 0; for (int i = 0; i < N; i++) { x = (double)rand() / RAND_MAX; y = (double)rand() / RAND_MAX; if (x * x + y * y < 1.0) hits++; } printf("pi: %lf\n", (hits / N) * 4); }
运行结果(N = 4000 * 4000):
这里的 time 是在 main() 函数中调用的计时功能,后面会介绍。
N 取这么小是因为这里只是一个demo,真正要计算圆周率的话不可能这么小的。
2. 统计方法
如果说蒙特卡罗法本质是随机撒点,那么这个本质就是均匀撒点。
源代码:
1 2 3 4 5 6 7 8 9
voidmethod_2(int N) { double x, y, hits = 0; for (x = 0; x < sqrt(N); x++) for (y = 0; y < sqrt(N); y++) if (x * x + y * y < N) hits++; printf("pi: %lf\n", (hits / N) * 4); }