I dagens avsnitt av skräckprogrammering... I Python-dokumenten för random.seed() def får vi veta "Om a är en int, används den direkt." [1] Men om du seedar med 3 eller -3 får du faktiskt exakt samma slumpobjekt, som producerar samma strömmar. (TIL). I nanochat använde jag tecknet som ett (vad jag trodde var) smart sätt att få olika slumpsekvenser för tåg/test-splits. Därför en riktigt grym bugg eftersom nu tåg=test. Jag hittade CPython-koden som är ansvarig i cpython/Modules/_randommodule.c [2], där vi på rad 321 ser i en kommentar: "Den här algoritmen bygger på att numret är osignerat. Så: om argen är en PyLong, använd dess absoluta värde." följt av n = PyNumber_Absolute(arg); som uttryckligen anropar abs() på ditt seed för att göra det positivt, och kastar bort teckenbiten. Men den här kommentaren är faktiskt också fel/missvisande. Under huven kallar Python Mersenne Twister MT19937-algoritmen, som i det generella fallet har tillståndet 19937 (icke-noll) bitar. Python tar din int (eller andra objekt) och "sprider" ut den informationen över dessa bitar. I princip kunde teckenbiten ha använts för att förstärka tillståndsbitarna. Det finns inget med algoritmen som "bygger på att numret är osignerat". Ett beslut togs att inte inkludera skyltdelen (vilket enligt mig var ett misstag). Ett trivialt exempel kan ha varit att avbilda n -> 2*abs(n) + int(n < 0). Slutligen leder detta oss till kontraktet för Pythons random, som inte heller är helt utstakat i dokumentationen. Kontraktet som nämns är att: samma frö => samma sekvens. Men det ges ingen garanti för att olika frön ger olika sekvenser. Så i princip lovar Python inte att t.ex. seed(5) och seed(6) är olika rng-strömmar. (Även om detta ganska ofta antas implicit i många tillämpningar.) Faktum är att vi ser att seed(5) och seed(-5) är identiska strömmar. Och du bör förmodligen inte använda dem för att separera dina tränings-/testbeteenden i maskininlärning. En av de mer underhållande programmeringsskräck-footguns jag nyligen stött på. Vi ses i nästa avsnitt. [1] [2]