A Mersenne Twister algoritmus inicializálásánál hogy lehet a maximális entrópiát biztosítani?
Adott a kód : [link]
Érdemi választ nem találtam csak a nyilvánvalót : [link]
Az init_by_array-nak adott input tömb esetében nem szolgáltat annyi állapotot mint amit naivan feltételeznénk. Pl. {2}-re ugyanaz az állapot lesz mint {2,1} - re.
624+1 elemű (true random) unsigned 32 bites tömb init_by_array-nak maximális entrópiát biztosíthatna (legalábbis naivan).
Mivel 2^(624*32) < 2^19937 így 624 elemű még nem lehet maximális entrópiájú, mivel 2^((624+1)*32) > 2^19937 így ebből kiindulva lehetne, de nem látom át a részleteibe, hogy ez igaz e.
A Mersenne Twister (MT) algoritmus esetében a maximális entrópia eléréséhez a legfontosabb, hogy a kezdeti állapotot megfelelően inicializáljuk. Az MT algoritmus teljesen kiszámíthatóvá válik 624 iteráció után, amikor az entrópiáját nullának kell tekinteni, de az azt követő eloszlás továbbra is egyenletes¹.
Az MT célja, hogy lehetőleg egyenletes eloszlást biztosítson, így az ember azt gondolná, hogy az entrópia maximalizálva van és egyenlő a mag hosszával. Azonban az MT teljesen kiszámíthatóvá válik 624 iteráció után, amikor az entrópiáját nullának kell tekinteni, de az azt követő eloszlás továbbra is egyenletes.
Ez azt jelenti, hogy pontosan $2^{32*624}$ különböző eredmény létezik $X$-re nézve, és mindegyik egyformán valószínű, tehát $X$ entrópiája $32*624=19968$ bit.
A `numpy` dokumentációja szerint, ha `None`-t adunk meg a `BitGenerator` inicializálásakor, akkor friss, kiszámíthatatlan entrópiát kapunk az operációs rendszertől. Ha egész számot vagy tömböt adunk meg, akkor azt a `SeedSequence` használja fel az első `BitGenerator` állapot levezetéséhez.
Ezért a maximális entrópia eléréséhez érdemes lehet a `BitGenerator`-t `None` értékkel inicializálni, hogy friss és kiszámíthatatlan entrópiát kapjunk. Ezután pedig figyelembe kell venni az MT sajátosságait és korlátait.
Elszámoltam magam mert 2^(624*32) = 2^19968 > 2^19937.
"Ezért a maximális entrópia eléréséhez érdemes lehet a `BitGenerator`-t `None` értékkel inicializálni, hogy friss és kiszámíthatatlan entrópiát kapjunk."
A numpy szerinti Mersenne Twister default None paramétere által pont nem használja ki a maximális entrópiát, ekkor a SeedSequence nem lesz hosszabb mint 128 bit, én sem értem miért így implenetálták.
A beépített random modul szerinti Mersenne Twister-ben van az amit írtam korábban a python modulról. Mivel 2^(624*32) > 2^19937 így több mint valószínű hogy közelítőleg maximálisan kihasználja, legalábbis amennyire tényleg random az operációs rendszer szerinti random, a _PyOS_URandomNonblock függvény szerint nem blokkolja (azaz ha elfogyott az entrópia nem várja meg míg összegyűlik annyi bitnyi entrópia mint amennyi további bitet kell adnija kimenetnek generátornak) az operációs rendszer szintű randomgenerátort ha elfogyott az entrópia, hanem generálja tovább.
"Ez azt jelenti, hogy pontosan $2^{32*624}$ különböző eredmény létezik $X$-re nézve, és mindegyik egyformán valószínű, tehát $X$ entrópiája $32*624=19968$ bit"
Ponthogy van ilyen "anomália" amit írtam, ha különböző hosszú tömböt adunk az init_by_array-nak, nem az lesz mint amit várna az ember.
Ha ezekkel a kulcs tömbökkel inicializálom : {2} vagy {2,1} vagy {2,1,0} vagy {2,1,0,4294967295} stb. ugyanaz lesz. Bár ha egyforma kulcshosszakat hasonlítunk össze akkor nem mondom hogy nem igaz, hogy a kezdőállapotokat kaotikusan (determinisztikusan) egyenletesen szórja.
Mj.: Látszik, hogy AI által generált válasz, a mélyebb összefüggéseket nem látja át és amit amúgy is megtaláltam olyat ír le ...
A `numpy` `BitGenerator` inicializálásánál a `None` érték valóban friss, kiszámíthatatlan entrópiát hoz létre az operációs rendszertől. Azonban, mint említette, a `SeedSequence` nem lesz hosszabb, mint 128 bit.
A Python beépített `random` modulja esetében, ha a `random` modul `initstate` függvényét használjuk, akkor a Mersenne Twister állapotát inicializálhatjuk egy 624 hosszúságú tömbbel, amely lehetővé teszi a teljes állapotteret. Ez valószínűleg közelebb áll ahhoz, amit szeretne elérni.
Az `init_by_array` függvény esetében a tömb hossza hatással lehet a generált szekvenciára. Különböző hosszúságú tömbök esetén az eredmények eltérőek lehetnek. Ez a Mersenne Twister algoritmus sajátossága.
Akit az ChatGPT válasza érdekel az az ChatGPT-t kérdezi meg, te meg ész nélkül bemásolod amit az válaszul adott. Nem mondom hogy nincs eset amikor teljesen megfelelő választ ad, de ez nem olyan eset. Python beépített random modul-jának nincs is initstate függvénye, getstate és setstate referenciákat tartalmaz melyek egy - a modul által automatikusan - példányosított random.Random típusú objektum 2 metódusára mutató 2 referencia.
Az is "szép" , hogy ember alkotta válasz nem is érkezett, bár már gyakorlati alkalmazási szinten tudom a választ.
Elnézést kérek a félreértésért és a hibás információért. Köszönöm, hogy jelezte a hibát. A Python beépített random moduljának valóban nincs initstate függvénye, és helyesen jegyezte meg, hogy a getstate és setstate függvényeket használja az állapot kezelésére.
A Mersenne Twister algoritmus és a numpy implementációja összetett, és a belső működésének megértése nehéz lehet. Az entrópia kezelése különösen bonyolult téma, és a maximális entrópia elérésének módja nagymértékben függ az adott alkalmazástól és a rendelkezésre álló erőforrásoktól.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!