Chương ACM địa phương của tôi trao giải thưởng cửa cho những người đến dự các cuộc họp. Tuy nhiên, bạn sẽ tăng cơ hội chiến thắng nếu giải được câu đố lập trình (nhưng tôi luôn giải câu đố đó). Vì vậy, một số người có 1 mục, trong khi những người khác có 2. Nhưng hãy chờ! Cách chương trình xổ số hoạt động không phải bằng cách thêm vào một mục khác khi ai đó giải câu đố. Thay vào đó, nó theo dõi số lượng "cuộc sống" của một người, giảm dần rằng nếu người đó được chọn trong mỗi lần vượt qua thuật toán lấy mẫu ngẫu nhiên của nó. Vì vậy, nó hoạt động như thế này:
Doorknob: 1. xnor: 2. Justin: 2. Alex: 1. Dennis: 2.
Sau đó, chương trình chọn ngẫu nhiên một trong số đó [Doorknob, xnor, Justin, Alex, Dennis]
, giảm số (nói là chọn Justin
):
Doorknob: 1. xnor: 2. Justin: 1. Alex: 1. Dennis: 2.
Và lặp lại. Nếu số "cuộc sống" của ai đó được chuyển đến 0
(hãy chọn Justin
lại), họ sẽ bị xóa khỏi danh sách:
Doorknob: 1. xnor: 2. Alex: 1. Dennis: 2.
Điều này tiếp tục cho đến khi có một người còn lại; người đó là người chiến thắng
Bây giờ câu hỏi thực sự là, xác suất mà tôi sẽ giành được là gì?
Bạn sẽ được cung cấp hai đầu vào:
n
. Đây là số người tham gia thử tháchk
. Đây là số người (trong số những ngườin
) có 2 cuộc sống. Con số này luôn bao gồm bạn.
Vì vậy, nếu tôi có một chức năng p
và được gọi p(10, 5)
, đó sẽ là xác suất giành được giải thưởng khi có tổng cộng 10 người, 5 trong số đó chỉ có 1 mạng, trong khi 5 (bao gồm cả bạn) có 2 mạng.
Bạn dự kiến sẽ đưa ra xác suất chiến thắng chính xác hoặc dưới dạng thập phân. Ở bất kỳ giá nào, câu trả lời phải chính xác đến và bao gồm vị trí thập phân thứ 4 sau dấu thập phân. Bạn có làm tròn số đó hay không là tùy thuộc vào bạn.
Giải pháp của bạn có thể là một giải pháp ngẫu nhiên đưa ra câu trả lời cho vị trí thập phân thứ 4 với xác suất cao . Bạn có thể cho rằng RNG tích hợp mà bạn sử dụng là thực sự ngẫu nhiên và nó phải đưa ra câu trả lời đúng với xác suất ít nhất 90%.
Hơn nữa, mã của bạn chỉ cần hoạt động n, k <= 1000
, mặc dù tôi đã cung cấp các trường hợp thử nghiệm lớn hơn so với những người tò mò.
Các trường hợp thử nghiệm
Lưu ý: một số trong số này là công thức chung.
n, k | output
----------+---------
1, 1 | 1
2, 2 | 0.5
2, 1 | 0.75
3, 1 | 11/18 = 0.611111111
1000, 1 | 0.007485470860550352
4, 3 | 0.3052662037037037
k, k | 1/k
n, 1 | (EulerGamma + PolyGamma[1 + n])/n (* Mathematica code *)
| (γ + ψ(1 + n))/n
10, 6 | 0.14424629234373537
300, 100 | 0.007871966408910648
500, 200 | 0.004218184180294532
1000, 500 | 0.0018008560286627948
---------------------------------- Extra (not needed to be a valid answer)
5000, 601 | 0.0009518052922680399
5000, 901 | 0.0007632938197806958
Đối với một vài kiểm tra khác, hãy thực hiện p(n, 1) * n
như sau:
n | output
------+---------
1 | 1
2 | 1.5
3 | 1.8333333333333335
10 | 2.928968253968254
100 | 5.1873775176396215
-------------------------- Extra (not needed to be a valid answer)
100000| 12.090146129863305
k
là bị tắt bởi một)