Dans l'épisode d'aujourd'hui de l'horreur de la programmation... Dans la documentation Python de random.seed(), on nous dit "Si a est un int, il est utilisé directement." [1] Mais si vous initialisez avec 3 ou -3, vous obtenez en fait le même objet rng, produisant les mêmes flux. (TIL). Dans nanochat, j'utilisais le signe comme une (ce que je pensais être) manière astucieuse d'obtenir différentes séquences rng pour les séparations train/test. D'où un bug épineux car maintenant train=test. J'ai trouvé le code CPython responsable dans cpython/Modules/_randommodule.c [2], où à la ligne 321, nous voyons dans un commentaire : "Cet algorithme repose sur le fait que le nombre soit non signé. Donc : si l'argument est un PyLong, utilisez sa valeur absolue." suivi de n = PyNumber_Absolute(arg); qui appelle explicitement abs() sur votre graine pour la rendre positive, en ignorant le bit de signe. Mais ce commentaire est en fait également faux/trompeur. En coulisses, Python appelle l'algorithme Mersenne Twister MT19937, qui dans le cas général a 19937 bits d'état (non nuls). Python prend votre int (ou d'autres objets) et "répartit" cette information à travers ces bits. En principe, le bit de signe aurait pu être utilisé pour augmenter les bits d'état. Il n'y a rien dans l'algorithme qui "dépend du nombre étant non signé". Une décision a été prise de ne pas incorporer le bit de signe (ce qui, à mon avis, était une erreur). Un exemple trivial aurait pu être de mapper n -> 2*abs(n) + int(n < 0). Enfin, cela nous amène au contrat de random de Python, qui n'est également pas entièrement explicité dans la documentation. Le contrat qui est mentionné est que : même graine => même séquence. Mais aucune garantie n'est faite que des graines différentes produisent des séquences différentes. Donc en principe, Python ne fait aucune promesse que par exemple seed(5) et seed(6) sont des flux rng différents. (Bien que cela soit assez couramment supposé implicitement dans de nombreuses applications.) En effet, nous voyons que seed(5) et seed(-5) sont des flux identiques. Et vous ne devriez probablement pas les utiliser pour séparer vos comportements train/test en apprentissage automatique. L'un des plus amusants pièges de programmation que j'ai rencontrés récemment. Nous vous verrons dans le prochain épisode. [1] [2]