Kedves diákjaim! Kvantumos véletlenszám-generálók statisztikai tulajdonságait (entrópia, frekvenciateszt) vizsgálja és hasonlítja össze. Ez a kód egyetemi szintű kutatásoknál vagy szimulációknál (pl. Monte Carlo-módszerek) elengedhetetlen statisztikai analízis alapjait mutatja be.Véletlenszám-generálók statisztikai analízise és entrópia vizsgálataA program előállít egy ál-véletlenszerű és egy elméleti alapokon nyugvó számsorozatot, majd kiszámolja azok Shannon-entrópiáját, és frekvenciatesztet végez (ellenőrzi az egyes és nullás bitek egyensúlyát).
-----------
import numpy as np
import math
from scipy.stats import chisquare
def shannon_entropy(data):
"""
Kiszámítja a Shannon-entrópiát bitekben.
A képlet: H(X) = - sum(P(x) * log2(P(x)))
"""
_, counts = np.unique(data, return_counts=True)
probabilities = counts / len(data)
entropy = -np.sum(probabilities * np.log2(probabilities))
return entropy
def frequency_test_bits(bit_string):
"""
Frekvencia (Monobit) teszt NIST SP 800-22 rev 1a alapján.
Ellenőrzi, hogy a 0-k és 1-k aránya megfelelő-e.
"""
n = len(bit_string)
# A biteket átváltjuk -1 és +1 értékekre
plus_minus = [1 if bit == '1' else -1 for bit in bit_string]
s_n = abs(sum(plus_minus))
p_value = math.erfc(s_n / math.sqrt(2 * n))
return s_n, p_value
def generate_academic_data():
# 1. Általános ál-véletlenszám generátor (pl. Mersenne Twister - np.random)
# 10 000 darab 8 bites véletlen integer generálása
prng_data = np.random.randint(0, 256, 10000)
# Konvertálás bináris stringgé
binary_prng = "".join(f"{x:08b}" for x in prng_data)
# 2. Elméleti minta (tökéletes eloszlás szimulációja)
theoretical_data = np.random.uniform(0, 256, 10000).astype(int)
binary_theoretical = "".join(f"{x:08b}" for x in theoretical_data)
return binary_prng, binary_theoretical
# Adatok generálása
prng_bits, theo_bits = generate_academic_data()
# Entrópia számítás
prng_entropy = shannon_entropy(list(prng_bits))
theo_entropy = shannon_entropy(list(theo_bits))
# Frekvencia teszt
s_n_prng, p_val_prng = frequency_test_bits(prng_bits)
s_n_theo, p_val_theo = frequency_test_bits(theo_bits)
# Eredmények kiíratása
print(f"--- Statisztikai Eredmények ---")
print(f"PRNG Entrópia: {prng_entropy:.4f} (Ideális: 1.0000)")
print(f"Elméleti Entrópia: {theo_entropy:.4f}")
print("-" * 35)
print(f"PRNG Frekvencia teszt (p-érték): {p_val_prng:.4f}")
print(f"Elméleti Frekvencia teszt (p-érték): {p_val_theo:.4f}")
print("Megjegyzés: Ha a p-érték < 0.01, a szekvencia szignifikánsan eltér a véletlentől.")
-------------
--- Statisztikai Eredmények ---
PRNG Entrópia: 1.0000 (Ideális: 1.0000)
Elméleti Entrópia: 1.0000
-----------------------------------
PRNG Frekvencia teszt (p-érték): 0.0681
Elméleti Frekvencia teszt (p-érték): 0.5338
Megjegyzés: Ha a p-érték < 0.01, a szekvencia szignifikánsan eltér a véletlentől.
Nincsenek megjegyzések:
Megjegyzés küldése