Trong tập hôm nay của nỗi kinh hoàng lập trình... Trong tài liệu Python về hàm random.seed(), chúng ta được thông báo "Nếu a là một số nguyên, nó sẽ được sử dụng trực tiếp." [1] Nhưng nếu bạn khởi tạo với 3 hoặc -3, bạn thực sự nhận được cùng một đối tượng rng, tạo ra cùng một luồng. (TIL). Trong nanochat, tôi đã sử dụng dấu hiệu như một cách (mà tôi nghĩ là) thông minh để có được các chuỗi rng khác nhau cho các phân chia train/test. Do đó, có một lỗi nghiêm trọng vì bây giờ train=test. Tôi đã tìm thấy mã CPython chịu trách nhiệm trong cpython/Modules/_randommodule.c [2], nơi ở dòng 321 chúng ta thấy trong một chú thích: "Thuật toán này dựa vào việc số đó là không dấu. Vì vậy: nếu đối số là một PyLong, hãy sử dụng giá trị tuyệt đối của nó." tiếp theo là n = PyNumber_Absolute(arg); điều này gọi rõ ràng hàm abs() trên hạt giống của bạn để làm cho nó dương, loại bỏ bit dấu. Nhưng chú thích này thực sự cũng sai/misleading. Ở cấp độ sâu, Python gọi thuật toán Mersenne Twister MT19937, mà trong trường hợp tổng quát có 19937 bit trạng thái (không bằng 0). Python lấy số nguyên của bạn (hoặc các đối tượng khác) và "phân tán" thông tin đó qua các bit này. Về nguyên tắc, bit dấu có thể đã được sử dụng để tăng cường các bit trạng thái. Không có gì về thuật toán "dựa vào việc số đó là không dấu". Một quyết định đã được đưa ra để không kết hợp bit dấu (mà theo ý kiến của tôi là một sai lầm). Một ví dụ đơn giản có thể là ánh xạ n -> 2*abs(n) + int(n < 0). Cuối cùng, điều này dẫn chúng ta đến hợp đồng của random trong Python, mà cũng không được nêu rõ hoàn toàn trong tài liệu. Hợp đồng được đề cập là: hạt giống giống nhau => chuỗi giống nhau. Nhưng không có đảm bảo nào được đưa ra rằng các hạt giống khác nhau tạo ra các chuỗi khác nhau. Vì vậy, về nguyên tắc, Python không hứa hẹn rằng ví dụ, seed(5) và seed(6) là các luồng rng khác nhau. (Mặc dù điều này thường được ngầm hiểu trong nhiều ứng dụng.) Thực tế, chúng ta thấy rằng seed(5) và seed(-5) là các luồng giống hệt nhau. Và bạn có lẽ không nên sử dụng chúng để tách biệt hành vi train/test của bạn trong học máy. Một trong những lỗi lập trình hài hước hơn mà tôi đã gặp gần đây. Hẹn gặp lại bạn trong tập tiếp theo. [1] [2]