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?