Subiecte populare
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
În episodul de azi al programării horror...
În documentația Python a random.seed() def, ni se spune
"Dacă a este un int, se folosește direct." [1]
Dar dacă semenezi cu 3 sau -3, obții exact același obiect RNG, producând aceleași fluxuri. (Am aflat acum). În nanochat foloseam semnul ca o metodă (pe care o credeam eu) ingenioasă de a obține secvențe RNG diferite pentru diviziunile tren/test. De aceea bug neplăcut, pentru că acum train=test.
Am găsit codul CPython responsabil în cpython/Modules/_randommodule.c [2], unde la linia 321 vedem într-un comentariu:
"Acest algoritm se bazează pe faptul că numărul este nesemnat. Deci: dacă arg-ul este un PyLong, folosiți valoarea sa absolută." urmat de
n = PyNumber_Absolute(arg);
care apelează explicit abs() pe sămânța ta pentru a o face pozitivă, eliminând bitul semnului.
Dar acest comentariu este de fapt greșit/înșelător. Sub capotă, Python numește algoritmul Mersenne Twister MT19937, care în cazul general are 19937 de biți (ne-zero). Python ia int-ul tău (sau alte obiecte) și "răspândește" acea informație pe aceste biți. În principiu, bitul de semn ar fi putut fi folosit pentru a suplimenta biții de stare. Nu există nimic în algoritm care să "se bazeze pe faptul că numărul este nesemnat". S-a luat decizia de a nu include bitul semnului (ceea ce, după părerea mea, a fost o greșeală). Un exemplu trivial ar fi fost să aplic n -> 2*abs(n) + int(n < 0).
În cele din urmă, acest lucru ne conduce la contractul random-ului din Python, care nu este nici el detaliat complet în documentație. Contractul menționat este:
aceeași sămânță = > aceeași secvență.
Dar nu există nicio garanție că semințele diferite produc secvențe diferite. Așadar, în principiu, Python nu promite că, de exemplu, seed(5) și seed(6) sunt fluxuri RNG diferite. (Deși acest lucru este destul de des presupus implicit în multe aplicații.) De fapt, vedem că seed(5) și seed(-5) sunt fluxuri identice. Și probabil nu ar trebui să le folosești pentru a separa comportamentele de antrenare/testare în machine learning. Una dintre cele mai amuzante pistoale de groază de programare pe care le-am întâlnit recent. Ne vedem în următorul episod.
[1]
[2]

Limită superioară
Clasament
Favorite

