Cách tốt nhất để làm điều đó là tạo một số ngẫu nhiên được phân phối đều trong một tập hợp số nhất định, sau đó áp dụng hàm chiếu cho tập từ 0 đến 100 trong đó phép chiếu có nhiều khả năng đạt các số bạn muốn.
Thông thường, cách toán học để đạt được điều này là vẽ một hàm xác suất của các số bạn muốn. Chúng ta có thể sử dụng đường cong hình chuông, nhưng để tính toán dễ dàng hơn, chỉ cần làm việc với một parabol lật.
Chúng ta hãy tạo một parabol sao cho gốc của nó ở 0 và 100 mà không làm lệch nó. Chúng ta có phương trình sau:
f(x) = -(x-0)(x-100) = -x * (x-100) = -x^2 + 100x
Bây giờ, tất cả các khu vực dưới đường cong từ 0 đến 100 là đại diện cho tập đầu tiên của chúng tôi, nơi chúng tôi muốn các số được tạo. Ở đó, thế hệ hoàn toàn ngẫu nhiên. Vì vậy, tất cả những gì chúng ta cần làm là tìm giới hạn của tập đầu tiên.
Tất nhiên, giới hạn dưới là 0. Giới hạn trên là tích phân của hàm số 100 của chúng tôi, đó là
F(x) = -x^3/3 + 50x^2
F(100) = 500,000/3 = 166,666.66666 (let's just use 166,666, because rounding up would make the target out of bounds)
Vì vậy, chúng tôi biết rằng chúng tôi cần tạo một số ở đâu đó trong khoảng từ 0 đến 166.666. Sau đó, chúng ta chỉ cần lấy số đó và chiếu nó vào tập thứ hai, nằm trong khoảng từ 0 đến 100.
Chúng tôi biết rằng số ngẫu nhiên chúng tôi tạo ra là một số tích phân của parabol của chúng tôi với đầu vào x trong khoảng từ 0 đến 100. Điều đó có nghĩa là chúng tôi chỉ cần giả sử rằng số ngẫu nhiên là kết quả của F (x) và giải cho x.
Trong trường hợp này, F (x) là một phương trình bậc ba và ở dạng F(x) = ax^3 + bx^2 + cx + d = 0
, các phát biểu sau là đúng:
a = -1/3
b = 50
c = 0
d = -1 * (your random number)
Việc giải quyết điều này cho x mang lại cho bạn số ngẫu nhiên thực tế mà bạn đang tìm kiếm, được đảm bảo nằm trong phạm vi [0, 100] và khả năng ở gần trung tâm cao hơn nhiều so với các cạnh.