Puncte:0

Implementarea hărții haotice pentru a produce un număr (pseudo)-aleatoriu

drapel in

Pentru proiectul meu, am folosit harta Henon pentru a genera un număr (pseudo)-aleatoriu. Am folosit următorul cod pentru a genera matricea numărului (pseudo)-aleatoriu.

def generate_by_henonmap(dimensiune, cheie):
    x = cheie[0]
    y = cheie[1]
    # Numărul total de bitSequence produse
    sequenceSize = dimensiune * dimensiune * 8
    bitSequence = [] # Fiecare bitSequence conține 8 biți
    byteArray = [] # Fiecare byteArray conține m bitSequence
    Matrice = [] # Fiecare Matrice conține m*n byteArray

    pentru i în interval (sequenceSize):
        # Harta clasică Henon are valori de a = 1,4 și b = 0,3
        xN = y + 1 - 1,4 * x**2
        yN = 0,3 * x

        x = xN
        y = yN

        dacă xN <= 0,4:
            bit = 0
        altceva:
            bit = 1

        încerca:
            bitSequence.append(bit)
        cu exceptia:
            bitSequence = [bit]

        dacă i % 8 == 7:
            zecimal = dec(bitSequence)
            încerca:
                byteArray.append(zecimal)
            cu exceptia:
                byteArray = [zecimală]
            bitSequence = []

        byteArraySize = dimensiune*8

        dacă i % byteArraySize == byteArraySize-1:
            încerca:
                Matrix.append(byteArray)
            cu exceptia:
                Matrice = [byteArray]
            byteArray = []

    return Matrix

Înainte de a utiliza acest cod în producția mea, testez aleatoritatea prin suita de teste NIST acest dar am obtinut acest rezultat:

Test eligibil de la NIST-SP800-22r1a:
-monobit
-frecvență_în_bloc
-aleargă
-cel mai lung_run_one_în_un_bloc
-dft
-potrivire_șabloane_ne_suprapune
-serial
-entropie_aproximativă
-sume cumulate
-excursie_aleatorie
-varianta_excursie_aleatorie
Rezultatele testului:
- APROBAT - scor: 0,525 - Monobit - timp scurs: 0 ms
- APROBAT - scor: 0,999 - Frecvență în bloc - timp scurs: 0 ms
- FAILED - scor: 0.0 - Runs - timp scurs: 1 ms
- FAILED - scor: 0,002 - Cele mai lungi runde dintr-un bloc - timp scurs: 0 ms
- FAILED - scor: 0,004 - Transformată Fourier discretă - timp scurs: 2 ms
- APROBAT - scor: 0,899 - Potrivire șablon fără suprapunere - timp scurs: 8 ms
- FAILED - scor: 0.0 - Serial - timp scurs: 54 ms
- FAILED - scor: 0,0 - Entropie aproximativă - timp scurs: 102 ms
- APROBAT - scor: 0,887 - Sume cumulate - timp scurs: 4 ms
- FAILED - scor: 0,11 - Random Excursion - timp scurs: 28 ms
- APROBAT - scor: 0,678 - Varianta de excursie aleatorie - timp scurs: 1 ms

Am crezut că Harta haotică poate genera destulă aleatorie, dar rezultatul a fost atât de frustrant. Există vreo eroare logică în interiorul codului care produce acest rezultat slab? Cred că modul în care generează secvența de biți a numărului creează problema.

        dacă xN <= 0,4:
            bit = 0
        altceva:
            bit = 1

Există vreo implementare mai bună a hărții haotice pentru a produce un număr (pseudo)-aleatoriu?

Paul Uszak avatar
drapel cn
Bună. Toate acestea sunt greșite, testul a durat ms? Ar trebui să dureze vârste mai ales pentru Python. Cât de mare a fost fișierul eșantion? De ce este `xN` atât de părtinitoare? Rulați `ent` pe fișierul eșantion și vedeți ce scrie. Este testul de aleatorie în acest stadiu.
fgrieu avatar
drapel ng
Două observații nu au fost menite ca o explicație a motivului pentru care testul eșuează: 1) se utilizează aproximarea în virgulă mobilă a variabilelor reale. Acest lucru invalidează argumentele bazate pe presupunerea unor variabile reale. În special, argumentele potrivit cărora transformarea duce la un comportament haotic și la o perioadă lungă se destramă, în teorie și într-o oarecare măsură practică. 2) Testele statistice experimentale precum testul NIST pot arăta uneori că un generator este nepotrivit; nu că ar fi bun pentru utilizarea criptografică. Este foarte ușor să faci un generator care trece testul NIST, dar care este previzibil din câteva ieșiri consecutive.
Puncte:2
drapel my

Problema cu acest generator de numere aleatoare este că biții sunt corelați; biții de ieșire adiacenți diferă în 70% din timp (desigur, pentru un flux aleator, ne-am aștepta ca ieșirea să difere în 50% din timp). Acest lucru este suficient pentru ca orice test care depinde de corelația biților să eșueze.

Acest rng se bazează pe haos, dar exponentul Lyapunov nu este suficient de mare pentru a ascunde corelația dintre stările eșantioanelor consecutive.

WhyMeasureTheory avatar
drapel in
Există vreo îmbunătățire a acestui rng sau ar trebui să folosesc o hartă haotică diferită? @poncho Sugestia ta va fi de mare ajutor pentru mine. Și mulțumesc pentru răspuns.
poncho avatar
drapel my
Cum să-l îmbunătățești ar depinde de ceea ce încerci să faci. Dacă încercați să veniți cu un rng statistic, ei bine, abordarea evidentă ar fi să calculați exponentul Lyapunov și, din aceasta, să determinați câți „pași” sunt necesari pentru a transforma inexactitățile în virgulă mobilă în variații în ieșirea biților. (și generează o singură ieșire odată cu atât de mulți pași). Dacă încercați să dezvoltați un „cripto rng”, ei bine, este mai dificil (din cauza problemelor pe care le-a subliniat fgrieu)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.