Argomenti di tendenza
#
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.
Nell'episodio di oggi dell'orrore della programmazione...
Nella documentazione di Python per random.seed(), ci viene detto
"Se a è un int, viene usato direttamente." [1]
Ma se semini con 3 o -3, ottieni effettivamente lo stesso oggetto rng, producendo gli stessi flussi. (TIL). In nanochat stavo usando il segno come un modo (che pensavo fosse) intelligente per ottenere diverse sequenze rng per le suddivisioni train/test. Da qui un bug complicato perché ora train=test.
Ho trovato il codice CPython responsabile in cpython/Modules/_randommodule.c [2], dove alla riga 321 vediamo in un commento:
"Questo algoritmo si basa sul fatto che il numero sia unsigned. Quindi: se l'argomento è un PyLong, usa il suo valore assoluto." seguito da
n = PyNumber_Absolute(arg);
che chiama esplicitamente abs() sul tuo seme per renderlo positivo, scartando il bit di segno.
Ma questo commento è in realtà sbagliato/misleading anche. Sotto il cofano, Python chiama l'algoritmo Mersenne Twister MT19937, che nel caso generale ha 19937 bit di stato (non zero). Python prende il tuo int (o altri oggetti) e "distribuisce" quelle informazioni su questi bit. In linea di principio, il bit di segno potrebbe essere stato usato per aumentare i bit di stato. Non c'è nulla nell'algoritmo che "si basa sul fatto che il numero sia unsigned". È stata presa la decisione di non incorporare il bit di segno (che imo era un errore). Un esempio banale potrebbe essere stato mappare n -> 2*abs(n) + int(n < 0).
Infine, questo ci porta al contratto di random di Python, che non è nemmeno completamente esplicitato nella documentazione. Il contratto che viene menzionato è che:
seme uguale => sequenza uguale.
Ma non viene garantito che semi diversi producano sequenze diverse. Quindi, in linea di principio, Python non fa promesse che ad esempio seed(5) e seed(6) siano flussi rng diversi. (Anche se questo è comunemente assunto implicitamente in molte applicazioni.) Infatti, vediamo che seed(5) e seed(-5) sono flussi identici. E probabilmente non dovresti usarli per separare i tuoi comportamenti train/test nel machine learning. Uno dei più divertenti errori di programmazione che ho incontrato recentemente. Ci vediamo nel prossimo episodio.
[1]
[2]

Principali
Ranking
Preferiti

