Tôi tính được số PI bằng nhân phẩm của 1 Senior Dev
Ở bài viết này chúng ta sẽ khám phá một cách tiếp cận độc đáo để tính toán số PI – một trong những hằng số của vũ trụ này. Thay vì sử dụng các công thức toán học phức tạp, hàn lâm chúng ta sẽ vận dụng sức mạnh của máy tính và lý thuyết của xác suất thống kê để ước tính giá trị của số PI. Rất thú vị mời các bạn đọc tiếp.
Ý tưởng khởi nguồn
Đặt vấn đề chúng ta có một hình tròn có bán kính là 1 (R = 1) vẽ trên trục tọa độ OXY. Bên ngoài hình tròn được bao bọc bởi một hình vuông có cạnh là 2.
Phỏng theo mô hình bên trên.
Ta có tỷ lệ giữa diện tích Circle và Square: Circle / Square
= PI * R^2 / 4 * R^2
Rút gọn ta được => Circle / Square = PI / 4 (1)
Mặt khác:
Gọi xác xuất để điểm A(X,Y) sao cho bất kỳ X,Y với điều kiện 0 <= X <= 1; 0 <= Y <= 1 nằm trong hình tròn là P. Thì P được xác định với công thức
P = n / N (2)
n: Tổng số lần điểm A nằm trong hình tròn
N: Tổng số lần chọn điểm A
Ta lại có P = Circle / Square (3)
Từ (1), (2), (3) => PI / 4 = n / N => PI = 4 * n / N
Hiện thực bằng code
Giải thuật với Kotlin, chạy thử tại https://play.kotlinlang.org/
fun main() {
val count = 10_000
var insideCircle = 0
for (i in 0..count) {
val randomX = random()
val randomY = random()
if (randomX * randomX + randomY * randomY < 1) {
insideCircle++
}
}
val pi = 4.0 * insideCircle / count
println("PI = " + pi)
} // giải thuật với Kotlin
Giải thuật với C++, chạy thử tại https://cpp.sh/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define NUM_POINTS 1000000
int main() {
srand(time(NULL)); // Khởi tạo SEED cho số ngẫu nhiên
int points_in_circle = 0;
for (int i = 0; i < NUM_POINTS; i++) {
double x = (double)rand() / RAND_MAX * 2 - 1;
double y = (double)rand() / RAND_MAX * 2 - 1;
if (x*x + y*y <= 1) {
points_in_circle++;
}
}
double pi_estimate = 4.0 * points_in_circle / NUM_POINTS;
printf("Giá trị ước tính của pi: %f\n", pi_estimate);
return 0;
}
Chúc các bạn thành công!