Cách tạo một điểm ngẫu nhiên trong vòng tròn bán kính R :
r = R * sqrt(random())
theta = random() * 2 * PI
(Giả sử random()
cho giá trị từ 0 đến 1 đồng nhất)
Nếu bạn muốn chuyển đổi điều này sang tọa độ Descartes, bạn có thể làm
x = centerX + r * cos(theta)
y = centerY + r * sin(theta)
Tại sao sqrt(random())
?
Chúng ta hãy nhìn vào toán học dẫn đến sqrt(random())
. Giả sử vì đơn giản chúng ta đang làm việc với vòng tròn đơn vị, tức là R = 1.
Khoảng cách trung bình giữa các điểm phải giống nhau bất kể chúng ta nhìn từ trung tâm bao xa. Điều này có nghĩa là, ví dụ, nhìn vào chu vi của một vòng tròn có chu vi 2, chúng ta sẽ tìm thấy số điểm gấp đôi số điểm trên chu vi của một vòng tròn có chu vi 1.
Do chu vi của một vòng tròn (2π r ) tăng tuyến tính với r , nên theo đó số lượng điểm ngẫu nhiên sẽ tăng tuyến tính với r . Nói cách khác, hàm mật độ xác suất mong muốn (PDF) tăng trưởng tuyến tính. Vì một tệp PDF nên có diện tích bằng 1 và bán kính tối đa là 1, chúng tôi có
Vì vậy, chúng ta biết mật độ mong muốn của các giá trị ngẫu nhiên của chúng ta sẽ trông như thế nào. Bây giờ: Làm thế nào để chúng ta tạo ra một giá trị ngẫu nhiên như vậy khi tất cả những gì chúng ta có là một giá trị ngẫu nhiên thống nhất trong khoảng từ 0 đến 1?
Chúng tôi sử dụng một mẹo gọi là lấy mẫu biến đổi nghịch đảo
- Từ PDF, tạo chức năng phân phối tích lũy (CDF)
- Phản chiếu cái này dọc theo y = x
- Áp dụng hàm kết quả cho giá trị đồng nhất trong khoảng từ 0 đến 1.
Nghe có vẻ phức tạp? Hãy để tôi chèn một blockquote với một bản nhạc phụ nhỏ truyền tải trực giác:
Giả sử chúng ta muốn tạo một điểm ngẫu nhiên với phân phối sau:
Đó là
- 1/5 số điểm thống nhất giữa 1 và 2, và
- 4/5 điểm thống nhất giữa 2 và 3.
CDF, như tên cho thấy, phiên bản tích lũy của PDF. Theo trực giác: Trong khi PDF ( x ) mô tả số lượng giá trị ngẫu nhiên tại x , CDF ( x ) mô tả số lượng giá trị ngẫu nhiên nhỏ hơn x .
Trong trường hợp này, CDF sẽ trông như sau:
Để xem điều này hữu ích như thế nào, hãy tưởng tượng rằng chúng ta bắn đạn từ trái sang phải ở độ cao phân bố đồng đều. Khi những viên đạn bắn trúng đường, chúng rơi xuống đất:
Xem làm thế nào mật độ của viên đạn trên mặt đất tương ứng với phân phối mong muốn của chúng tôi! Chúng ta gần đến rồi!
Vấn đề là đối với chức năng này, trục y là đầu ra và trục x là đầu vào . Chúng ta chỉ có thể "bắn đạn từ mặt đất lên"! Chúng ta cần hàm nghịch đảo!
Đây là lý do tại sao chúng ta phản ánh toàn bộ sự việc; x trở thành y và y trở thành x :
Chúng tôi gọi đây là CDF -1 . Để có được các giá trị theo phân phối mong muốn, chúng tôi sử dụng CDF -1 (ngẫu nhiên ()).
Vì vậy, quay lại để tạo các giá trị bán kính ngẫu nhiên trong đó PDF của chúng tôi bằng 2 x .
Bước 1: Tạo CDF:
Vì chúng tôi đang làm việc với thực tế, CDF được thể hiện dưới dạng tích phân của PDF.
CDF ( x ) = ∫ 2 x = x 2
Bước 2: Phản chiếu CDF dọc theo y = x :
Về mặt toán học, điều này có nghĩa là thay đổi x và y và giải cho y :
CDF : y = x 2
Hoán đổi: x = y 2
Giải: y = √ x
CDF -1 : y = √ x
Bước 3: Áp dụng hàm kết quả cho giá trị đồng nhất trong khoảng từ 0 đến 1
CDF -1 (ngẫu nhiên ()) = √random ()
Đó là những gì chúng tôi đặt ra để rút ra :-)