V dnešní epizodě programování hororu... V python dokumentaci o random.seed() rozhodně se říká, že "Pokud je a int, používá se přímo." [1] Ale pokud seedujete s 3 nebo -3, dostanete přesně stejný RNG objekt, který produkuje stejné streamy. (DNES jsem se dnes dozvěděl). V nanochatu jsem používal znak jako (podle mého názoru) chytrý způsob, jak získat různé sekvence RNG pro rozdělení tréninků a testů. Proto je to špatný bug, protože teď train=test. CPython kód jsem našel v cpython/Modules/_randommodule.c [2], kde na řádku 321 vidíme v komentáři: "Tento algoritmus spoléhá na to, že číslo není podepsáno. Takže: pokud je arg PyLong, použijte jeho absolutní hodnotu." následovanou n = PyNumber_Absolute(arg); který explicitně volá ABS() na vaše seed, aby byl kladný, a vylučuje sign bit. Ale tento komentář je vlastně také špatný/zavádějící. Pod kapotou Python nazývá algoritmus Mersenne Twister MT19937, který má obecně stav 19937 (nenulových) bitů. Python vezme vaši int (nebo jiné objekty) a "rozprostří" tyto informace mezi tyto bity. V zásadě mohl být znak bit použit k rozšíření stavových bitů. Na algoritmu není nic, co by "spoléhalo na to, že číslo není podepsáno". Bylo rozhodnuto nezahrnout znak (což podle mě byla chyba). Jedním triviálním příkladem by mohlo být zobrazení n -> 2*abs(n) + int(n < 0). Nakonec nás to přivádí ke smlouvě o náhodnosti Pythonu, která také není v dokumentaci plně vysvětlena. Zmíněná smlouva je: stejné semínko => stejná sekvence. Ale není zaručeno, že různá semena produkují různé sekvence. Takže v zásadě Python neslibuje, že například seed(5) a seed(6) jsou různé rng proudy. (Ačkoliv je to v mnoha aplikacích často implicitně předpokládáno.) Vidíme opravdu, že seed(5) a seed(-5) jsou identické proudy. A pravděpodobně byste je neměli používat k oddělení tréninku/testování chování ve strojovém učení. Jedna z nejzábavnějších programátorských hororových footgunů, na které jsem v poslední době narazil. Uvidíme se v příští epizodě. [1] [2]