TGViewer
Zen of Python Zen of Python @zen_of_python · 18.8K subscribers
Post #4683 3.31K
Python's random.seed() игнорирует знак числа — и это не баг

Андрей Карпати наткнулся на неочевидное поведение: random.seed(5) и random.seed(-5) дают одинаковую последовательность случайных чисел.​

➡️ Как обнаружилось
Карпати работал над nanochat и хотел использовать знак seed'а для разделения train/test данных. Получил баг: train и test оказались идентичными.​

➡️ Почему так
В исходниках CPython (_randommodule.c, строка 321) явно вызывается abs():
// "This algorithm relies on the number being unsigned"
n = PyNumber_Absolute(arg);

Знак просто отбрасывается.​

➡️ Баг или фича?
Формально — не баг. Документация гарантирует только то, что одинаковый seed даст одинаковую последовательность. Но не гарантирует, что разные seed'ы дадут разные последовательности.​

Карпати считает это ошибкой дизайна: знаковый бит мог бы удвоить пространство seed'ов. Простое решение: n -> 2*abs(n) + int(n < 0).​

➡️ Что дальше

🔘Не полагаться на отрицательные seed'ы как на «другие»

🔘В NumPy отрицательные seed'ы вызывают ошибку — там строже​

🔘Открыт issue на GitHub для обновления документации​

import random
random.seed(42)
print(random.random()) # 0.6394267984578837

random.seed(-42)
print(random.random()) # 0.6394267984578837


@zen_of_python
  • 🔥 10
  • ❤ 3
  • 😱 2
More from @zen_of_python
  1. Sep 23, 2026Как __getitem__ превращает объект Python в итерируемый Для цикла for объекту не всегда нуж…
  2. Sep 23, 2026Что меняет re.prefixmatch() в Python 3.15 re.match() проверяет совпадение только в начале…
  3. Sep 23, 2026Pyodide разрешил публиковать WASM-колёса прямо в PyPI В Pyodide 314.0 появилась прямая пуб…
  4. Sep 22, 2026Как применять структурное сопоставление с образцом к деревьям в Python Структурное сопоста…
  5. Sep 22, 2026Почему в Python стоит подменять свой интерфейс, а не httpx Если бизнес-тест напрямую подме…
  6. Sep 22, 2026Как точно типизировать *args и **kwargs в Python Запись *args: tuple[int, str] выглядит ка…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →