Bộ sinh số giả ngẫu nhiên (để kết quả tái lập được, không dùng random thật): Cho số nguyên seed ≥0. Đặt s0=seed. Với i=1,2,3,…: si=(1103515245⋅si−1+12345)mod231. Số ngẫu nhiên thứ i là ui=si/231∈[0,1). Dãy u1,u2,u3,… được lấy theo ĐÚNG thứ tự này, dùng tuần tự trong suốt quá trình mô phỏng.
Bài toán: Có n loại phiếu quà tặng (2≤n≤500, riêng n=1 vẫn hợp lệ). Mỗi lượt rút phiếu, ta nhận được ngẫu nhiên đều một trong n loại. Bài toán sưu tập phiếu (coupon collector) hỏi: cần rút bao nhiêu lượt để có đủ cả n loại?
Mô phỏng M lần thí nghiệm độc lập (thứ tự số ngẫu nhiên dùng tuần tự toàn cục qua các lần thí nghiệm, lần thí nghiệm trước dùng xong mới sang lần sau). Ở thí nghiệm thứ j, tại lượt rút thứ t (tính từ 1, tăng dần không giới hạn theo từng lượt), lấy số ngẫu nhiên kế tiếp u và xác định loại phiếu nhận được là type=⌊u⋅n⌋+1 (thuộc 1..n). Tiếp tục rút cho đến khi đã nhận đủ n loại KHÁC NHAU, gọi Dj là số lượt đã rút.
Để đảm bảo chương trình luôn dừng, giới hạn an toàn MAXDRAW=20000: nếu rút đến lượt thứ 20000 mà vẫn CHƯA đủ n loại, dừng lại và quy ước Dj=20000.
Sau M thí nghiệm, in ra:
Ví dụ: n=3, M=2, seed=1 → 4.500000 5.
Một dòng gồm 3 số nguyên n M seed (1≤n≤500; 0≤M≤200; 0≤seed<231).
Dˉ (6 chữ số thập phân) và maxjDj (số nguyên), cách nhau khoảng trắng.
Ví dụ:
Đầu vào:
1 0 1
Đầu ra:
0.000000 0
Đầu vào:
1 1 1
Đầu ra:
1.000000 1
Đang tải editor...