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: Cho một xích Markov rời rạc gồm k trạng thái đánh số 0,1,…,k−1 (2≤k≤5). Ma trận chuyển được cho dưới dạng phân số với mẫu số chung Q: dòng thứ i gồm k số nguyên không âm pi,0,…,pi,k−1 với ∑jpi,j=Q; xác suất chuyển từ trạng thái i sang j là pi,j/Q.
Xét ngưỡng tích lũy của dòng i: ci,0=pi,0/Q, ci,j=ci,j−1+pi,j/Q với j≥1. Trạng thái bắt đầu luôn là 0.
Mô phỏng M chuỗi độc lập, mỗi chuỗi T bước; số ngẫu nhiên lấy TUẦN TỰ toàn cục: chuỗi 1 dùng T số đầu tiên (mỗi bước 1 số), rồi đến chuỗi 2, v.v. Tại một bước, đang ở trạng thái i, lấy số ngẫu nhiên kế tiếp u; trạng thái kế tiếp là chỉ số j NHỎ NHẤT sao cho u<ci,j (nếu do sai số không tìm được j nào, quy ước chọn j=k−1).
Sau khi mô phỏng xong (tổng cộng M×T bước, TRẠNG THÁI XUẤT PHÁT KHÔNG được tính), đếm số bước rơi vào mỗi trạng thái và in ra k tỉ lệ (đếm/(M×T)), làm tròn 6 chữ số thập phân, theo đúng thứ tự trạng thái 0,1,…,k−1, cách nhau khoảng trắng (quy ước toàn bộ =0 nếu M×T=0).
Ví dụ: k=2,Q=2,M=2,T=3,seed=1, ma trận (1111) (mỗi dòng chia đều Q=2) → 0.500000 0.500000.
Dòng 1: 5 số nguyên k Q M T seed (2≤k≤5; 1≤Q≤1000; 0≤M≤2000; 0≤T≤2000; 0≤seed<231). k dòng tiếp theo: mỗi dòng k số nguyên không âm pi,0,…,pi,k−1 với tổng bằng Q.
Một dòng gồm k số thực (mỗi số 6 chữ số thập phân), cách nhau khoảng trắng, theo thứ tự trạng thái 0..k−1.
Ví dụ:
Đầu vào:
2 2 0 5 1
1 1
1 1
Đầu ra:
0.000000 0.000000
Đầu vào:
2 2 1 0 1
1 1
1 1
Đầu ra:
0.000000 0.000000
Đang tải editor...