Tendencias del momento
#
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.
En el episodio de hoy de horror de programación...
En la documentación de Python sobre random.seed() se nos dice
"Si a es un int, se utiliza directamente." [1]
Pero si siembras con 3 o -3, en realidad obtienes el mismo objeto rng, produciendo las mismas secuencias. (TIL). En nanochat estaba usando el signo como una (lo que pensé que era) forma ingeniosa de obtener diferentes secuencias de rng para las divisiones de entrenamiento/prueba. Por lo tanto, un error complicado porque ahora train=test.
Encontré el código de CPython responsable en cpython/Modules/_randommodule.c [2], donde en la línea 321 vemos en un comentario:
"Este algoritmo depende de que el número sea sin signo. Así que: si el argumento es un PyLong, usa su valor absoluto." seguido de
n = PyNumber_Absolute(arg);
que llama explícitamente a abs() en tu semilla para hacerla positiva, descartando el bit de signo.
Pero este comentario también es en realidad incorrecto/misleading. En el fondo, Python llama al algoritmo Mersenne Twister MT19937, que en el caso general tiene 19937 bits de estado (no cero). Python toma tu int (u otros objetos) y "distribuye" esa información a través de estos bits. En principio, el bit de signo podría haberse utilizado para aumentar los bits de estado. No hay nada en el algoritmo que "depende de que el número sea sin signo". Se tomó la decisión de no incorporar el bit de signo (lo cual, en mi opinión, fue un error). Un ejemplo trivial podría haber sido mapear n -> 2*abs(n) + int(n < 0).
Finalmente, esto nos lleva al contrato de random de Python, que tampoco está completamente especificado en la documentación. El contrato que se menciona es que:
semilla igual => secuencia igual.
Pero no se garantiza que diferentes semillas produzcan diferentes secuencias. Así que, en principio, Python no promete que, por ejemplo, seed(5) y seed(6) sean flujos de rng diferentes. (Aunque esto se asume comúnmente de manera implícita en muchas aplicaciones). De hecho, vemos que seed(5) y seed(-5) son flujos idénticos. Y probablemente no deberías usarlos para separar tus comportamientos de entrenamiento/prueba en aprendizaje automático. Uno de los más divertidos errores de programación que he encontrado recientemente. Nos vemos en el próximo episodio.
[1]
[2]

Parte superior
Clasificación
Favoritos

