thể trùng lặp:
how to get uniformed random between a, b by a known uniformed random function RANDOM(0,1)Làm thế nào để thực hiện Random (a, b) chỉ với Random (0,1)?
Trong cuốn sách của Giới thiệu về các thuật toán, có một tiêu thụ đặc biệt:
Mô tả một thực hiện các thủ tục Random (a, b) chỉ thực hiện các cuộc gọi đến Ngẫu nhiên (0,1). Thời gian chạy dự kiến của thủ tục của bạn, như là một hàm của a và b? Xác suất của kết quả ngẫu nhiên (a, b) phải được phân bố đồng đều thuần túy, như ngẫu nhiên (0,1)
Đối với hàm ngẫu nhiên, kết quả là số nguyên giữa a và b, bao hàm. Ví dụ: Random (0,1) tạo ra 0 hoặc 1; Random (a, b) tạo ra một, a + 1, a + 2, ..., b
Giải pháp của tôi là như thế này:
for i = 1 to b-a
r = a + Random(0,1)
return r
thời gian chạy là T = ba
Điều này có đúng không? Các kết quả của các giải pháp của tôi có được phân phối đồng đều không?
Cảm ơn
gì nếu giải pháp mới của tôi là như thế này:
r = a
for i = 1 to b - a //including b-a
r += Random(0,1)
return r
Nếu nó không phải là đúng, tại sao r + = Random (0,1) làm cho r phân bố không đều?
Giải pháp của bạn không được phân phối đồng đều. Ví dụ: giá trị thấp nhất 'a' chỉ có thể được" tính "bằng tổng số ngẫu nhiên (0) + ngẫu nhiên (0) + ngẫu nhiên (0) + .... tuy nhiên xác suất của một giá trị trong" giữa "là cao hơn vì nó có thể được tính là 0 + 0 + 0 + 1 + 1 và 0 + 0 + 1 + 0 + 1 và 1 + 1 + 0 + 0 + 0, v.v. Hãy nghĩ về nó như ném 2 dices. Xác suất nhận được 2 (1 + 1) hoặc 12 (6 + 6) thấp hơn xác suất nhận được 7 (1 + 6,2 + 5,3 + 4,4 + 3,5 + 2,6 + 1) (những người định cư của catan ftw.;)). – Progman
Dòng thứ hai của bạn đặt lại 'r' mỗi lần. Bạn nên khởi tạo nó thành 'a' và sau đó cập nhật nó theo chính nó trong vòng lặp. –