I dagens episode med skrekkprogrammering... I Python-dokumentene til random.seed() def får vi beskjed om "Hvis a er en int, brukes den direkte." [1] Men hvis du setter med 3 eller -3, får du faktisk nøyaktig det samme RNG-objektet, som produserer de samme strømmene. (TIL). I nanochat brukte jeg tegnet som en (det jeg trodde var) smart måte å få forskjellige RNG-sekvenser for tog/test-splitter. Derfor en skikkelig bug fordi nå tog=test. Jeg fant CPython-koden som er ansvarlig i cpython/Modules/_randommodule.c [2], hvor vi på linje 321 ser i en kommentar: "Denne algoritmen er avhengig av at nummeret er usignert. Så: hvis argen er en PyLong, bruk dens absolutte verdi." etterfulgt av n = PyNumber_Absolute(arg); som eksplisitt kaller abs() på frøet ditt for å gjøre det positivt, og forkaster fortegnbiten. Men denne kommentaren er faktisk feil/misvisende også. Under panseret kaller Python Mersenne Twister MT19937-algoritmen, som i det generelle tilfellet har tilstanden 19937 (ikke-null) biter. Python tar din int (eller andre objekter) og "sprer ut" den informasjonen over disse bitene. I prinsippet kunne tegnbiten ha blitt brukt til å utvide tilstandsbitene. Det er ingenting ved algoritmen som «er avhengig av at tallet er usignert». Det ble tatt en beslutning om å ikke inkludere skiltbiten (som etter min mening var en feil). Et trivielt eksempel kunne vært å avbilde n -> 2*abs(n) + int(n < 0). Til slutt leder dette oss til kontrakten for Pythons random, som heller ikke er fullt ut beskrevet i dokumentasjonen. Kontrakten som nevnes er at: samme frø => samme sekvens. Men det gis ingen garanti for at forskjellige frø gir ulike sekvenser. Så i prinsippet lover ikke Python at for eksempel seed(5) og seed(6) er forskjellige RNG-strømmer. (Selv om dette ganske ofte antas implisitt i mange anvendelser.) Faktisk ser vi at seed(5) og seed(-5) er identiske bekker. Og du bør sannsynligvis ikke bruke dem til å skille trenings-/testatferden din i maskinlæring. En av de mer morsomme programmeringsskrekk-fotpistolene jeg har støtt på nylig. Vi sees i neste episode. [1] [2]