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()