Загрузка данных


import matplotlib.pyplot as plt
import numpy as np

# --- 1. Генераторы ---

def good_lcg(n, seed=12345):
    """
    "Хороший" LCG (например, стандартный из ANSI C).
    Параметры подобраны так, чтобы период был максимальным,
    но даже у хорошего LCG есть структура.
    """
    m = 2**31
    a = 1103515245
    c = 12345
    x = seed
    results = []
    for _ in range(n):
        x = (a * x + c) % m
        results.append(x / m) # Сразу нормализуем в [0, 1)
    return results

def park_miller(n, seed=12345):
    """
    Парк-Миллер (минимальный стандартный генератор).
    Считается довольно качественным для простых задач.
    """
    m = 2**31 - 1
    a = 16807
    x = seed
    results = []
    for _ in range(n):
        x = (a * x) % m
        results.append(x / m) # Нормализация в [0, 1)
    return results

# --- 2. Подготовка данных для графика ---

N = 5000 # Количество пар

# Получаем последовательности
seq_lcg = good_lcg(N + 1) # Берем N+1, чтобы хватило на пары
seq_pm = park_miller(N + 1)

# Создаем пары (X_i, X_{i+1})
x_lcg = seq_lcg[:-1] # Все элементы кроме последнего
y_lcg = seq_lcg[1:]  # Все элементы кроме первого

x_pm = seq_pm[:-1]
y_pm = seq_pm[1:]

# --- 3. Построение графиков (Scatter Plot) ---

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# График для LCG
axes[0].scatter(x_lcg, y_lcg, s=1, alpha=0.5, color='blue')
axes[0].set_title('Хороший LCG: Пары (X_i, X_{i+1})')
axes[0].set_xlabel('X_i')
axes[0].set_ylabel('X_{i+1}')
axes[0].set_xlim(0, 1)
axes[0].set_ylim(0, 1)
axes[0].grid(True, linestyle='--', alpha=0.6)

# График для Park-Miller
axes[1].scatter(x_pm, y_pm, s=1, alpha=0.5, color='green')
axes[1].set_title('Park-Miller: Пары (X_i, X_{i+1})')
axes[1].set_xlabel('X_i')
axes[1].set_ylabel('X_{i+1}')
axes[1].set_xlim(0, 1)
axes[1].set_ylim(0, 1)
axes[1].grid(True, linestyle='--', alpha=0.6)

plt.tight_layout()
plt.show()