Tôi tính được số PI nhờ nhân phẩm
Tôi tính được số PI nhờ nhân phẩm

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.

Circle and Square Areas R = 1 Circle = π * R² Square = 4 * R² O(0, 0)

Phỏng theo mô hình bên trên.

Ta có tỷ lệ giữa diện tích CircleSquare: 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!