No episódio de hoje do programa de horror... Na documentação em Python do random.seed() def, nos disseram "Se a for um int, ele é usado diretamente." [1] Mas se você semear com 3 ou -3, na verdade obtém exatamente o mesmo objeto de RNG, produzindo os mesmos fluxos. (Aprendi hoje). No NanoChat, eu estava usando o sinal como uma forma (que eu achava que era) inteligente para obter diferentes sequências de RNG para divisões de tren/teste. Daí bug nojento porque agora treino = teste. Achei o código CPython responsável em cpython/Modules/_randommodule.c [2], onde na linha 321 vemos em um comentário: "Esse algoritmo depende do número ser não sinalizado. Então: se o arg for um PyLong, use seu valor absoluto." seguido de n = PyNumber_Absolute(arg); que explicitamente chama abs() na sua seed para torná-la positiva, descartando o bit de sinal. Mas esse comentário também está errado/enganoso. Por trás do capot, o Python chama o algoritmo Mersenne Twister MT19937, que no caso geral tem 19937 bits (não zero) de estado. Python pega sua int (ou outros objetos) e "espalha" essa informação entre esses bits. Em princípio, o bit de sinal poderia ter sido usado para aumentar os bits de estado. Não há nada no algoritmo que "dependa do número ser não sinalizado". Foi tomada a decisão de não incorporar a parte do sinal (o que, na minha opinião, foi um erro). Um exemplo trivial poderia ter sido mapear n -> 2*abs(n) + int(n < 0). Finalmente, isso nos leva ao contrato do aleatório de Python, que também não está totalmente detalhado na documentação. O contrato mencionado é o seguinte: Mesma semente = > mesma sequência. Mas não há garantia de que sementes diferentes produzam sequências diferentes. Então, em princípio, o Python não promete que, por exemplo, seed(5) e seed(6) sejam fluxos de RNG diferentes. (Embora isso seja bastante comumente assumido implicitamente em muitas aplicações.) De fato, vemos que seed(5) e seed(-5) são fluxos idênticos. E provavelmente você não deveria usá-los para separar seus comportamentos de treino/teste em aprendizado de máquina. Uma das armas de footgun de horror de programação mais divertidas que encontrei recentemente. Nos vemos no próximo episódio. [1] [2]