2026. június 24., szerda

Entrópia a Monte Carlo módszer vizsgálat


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