У сьогоднішньому епізоді програмного жаху... У Python-документації random.seed() def. нам кажуть "Якщо a — це інтелект, його використовують безпосередньо." [1] Але якщо ви сідуєте з 3 або -3, ви отримуєте той самий об'єкт випадковості, що створює ті самі потоки. (Сьогодні дізнався). У Nanochat я використовував цей знак як (як мені здавалося) розумний спосіб отримати різні послідовності RNG для тренування/тестового спліту. Ось чому це жахлива помилка, бо тепер train=test. Я знайшов код CPython, відповідальний у cpython/Modules/_randommodule.c [2], де на рядку 321 ми бачимо в коментарі: "Цей алгоритм базується на тому, що номер не підписаний. Отже: якщо arg — це PyLong, використовуйте його абсолютне значення.» після чого слідує n = PyNumber_Absolute(arg); який явно викликає abs() на вашому сіді, щоб зробити його позитивним, відкидаючи біт знаку. Але цей коментар насправді неправильний і вводить в оману. Під капотом Python викликає алгоритм Mersenne Twister MT19937, який у загальному випадку має стан бітів 19937 (ненульова). Python бере ваш int (або інші об'єкти) і «розподіляє» цю інформацію по цих бітах. У принципі, біт знаку міг би використовуватися для доповнення бітів стану. В алгоритмі немає нічого, що «покладається на непідписане число». Було прийнято рішення не включати знак (що, на мою думку, було помилкою). Одним із тривіальних прикладів могло б бути відображення n -> 2*abs(n) + int(n < 0). Нарешті, це приводить нас до контракту випадкового Python, який також не повністю викладений у документації. Договір, який згадується, такий: те саме насіння => та сама послідовність. Але немає гарантії, що різні насінини дають різні послідовності. Отже, в принципі, Python не дає жодних гарантій, що, наприклад, seed(5) і seed(6) — це різні потоки випадковості. (Хоча це досить часто неявно припускається у багатьох застосуваннях.) Справді, ми бачимо, що seed(5) і seed(-5) — це ідентичні потоки. І, ймовірно, не варто використовувати їх для розділення поведінки тренувань/тестування в машинному навчанні. Один із найкумедніших програмуючих хорорів, з якими я нещодавно стикався. Побачимось у наступному епізоді. [1] [2]