rand()
Bài talk khá hay về việc sinh số ngẫu nhiên (trong trường hợp này là ngôn ngữ C++). Làm mình nhớ đến 1 bài tập trong The Art of Computer Programming (TAOCP - Vol 2): “hãy thử thay đổi random generator trong máy tính bằng một thuật toán tốt hơn, và quan sát điều kì diệu sẽ xảy ra”
Bài talk duy chỉ nói về việc dùng hàm rand()
và đặc biệt sử dụng chung với %
(mod) hay floating point scale là thực sự sai lầm và nghiêm trọng . Đặc biệt, nó không hề tạo ra uniform distribution như ta thường nghĩ, thậm chí nó khiến cho 1 số giá trị đặc biệt hiếm khi xảy ra 😄
Bản chất hàm rand
được implement khá đơn giản linear congruential nhờ tận dụng tính chất của số căn nguyên thủy (xem Lehmer random generator). Điều thú vị nằm ở chỗ 1 tính chất không liên quan mấy bên lý thuyết số lại hỗ trợ cho việc sinh số ngẫu nhiên.
Btw, TAOCP Vol 2 nói khá kĩ về vấn đề này. Một kỹ thuật để check xem empirical results có đúng với probabilities không (uniform distribution với biến ngẫu nhiên rời rạc), đó là dùng Chi squared test.
Link: https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful