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


import matplotlib.pyplot as plt
import numpy as np

def lcg(x, a, c, m):
    return (a * x + c) % m

def park_miller(x, a, m):
    return (a * x) % m

def lcg2(x0, a, c, m, ni):
    xn = x0
    l = [xn]
    f = False
    for i in range(ni):
        xn = lcg(xn, a, c, m)
        if xn == x0:
            print(len(l))
            print(l)
            f = True
            break
        l.append(xn)
    if not f:
        print("нет совпадений")

def park_miller2(x0, a, m, ni):
    xn = x0
    l = [xn]
    f = False
    for i in range(ni):
        xn = park_miller(xn, a, m)
        if xn == x0:
            print(len(l))
            print(l)
            f = True
            break
        l.append(xn)
    if not f:
        print("нет совпадений")

# 1

# плохой lcg
x0 = 1
a = 7
c = 9
m = 150

lcg2(x0, a, c, m, 10**6)

# хороший lcg
x0 = 1
a = 1103515245
c = 12345
m = 2**31

lcg2(x0, a, c, m, 10**6)

# park-miller
x0 = 2222
a = 16807
m = 2**31 - 1

park_miller2(x0, a, m, 10**6)

# 2.1

def lcg3(x0, a, c, m, ni):
    xn = x0
    l = [xn]
    for i in range(ni):
        xn = lcg(xn, a, c, m)
        l.append(xn)
    return l

def park_miller3(x0, a, m, ni):
    xn = x0
    l = [xn]
    for i in range(ni):
        xn = park_miller(xn, a, m)
        l.append(xn)
    return l

bad = lcg3(1, 7, 9, 150, 10000)
mill = park_miller3(2222, 16807, 2**31 - 1, 10000)

lcgm2 = [x%2 for x in bad]
lcgm4 = [x%4 for x in bad]
pmm2 = [x%2 for x in mill]
pmm4 = [x%4 for x in mill]

fig, axes = plt.subplots(2, 2, figsize=(12, 8))

# LCG mod 2
axes[0, 0].hist(lcgm2, bins=[-0.5, 0.5, 1.5], edgecolor='black', rwidth=0.8)
axes[0, 0].set_title('LCG: Остатки по модулю 2')
axes[0, 0].set_xticks([0, 1])
axes[0, 0].set_xticklabels(['0', '1'])
 
# LCG mod 4
axes[0, 1].hist(lcgm4, bins=[-0.5, 0.5, 1.5, 2.5, 3.5], edgecolor='black', rwidth=0.8)
axes[0, 1].set_title('LCG: Остатки по модулю 4')
axes[0, 1].set_xticks([0, 1, 2, 3])
 
# Park-Miller mod 2
axes[1, 0].hist(pmm2, bins=[-0.5, 0.5, 1.5], edgecolor='black', rwidth=0.8)
axes[1, 0].set_title('Park-Miller: Остатки по модулю 2')
axes[1, 0].set_xticks([0, 1])
axes[1, 0].set_xticklabels(['0', '1'])
 
# Park-Miller mod 4
axes[1, 1].hist(pmm4, bins=[-0.5, 0.5, 1.5, 2.5, 3.5], edgecolor='black', rwidth=0.8)
axes[1, 1].set_title('Park-Miller: Остатки по модулю 4')
axes[1, 1].set_xticks([0, 1, 2, 3])
 
plt.tight_layout()
plt.show()


# 2.2

def lcg4(x0, a, c, m, ni):
    xn = x0
    l = [xn]
    for i in range(ni):
        xn = lcg(xn, a, c, m)
        l.append(xn/m)
    return l

def park_miller4(x0, a, m, ni):
    xn = x0
    l = [xn]
    for i in range(ni):
        xn = park_miller(xn, a, m)
        l.append(xn/m)
    return l

seq_lcg = lcg4(1, 1103515245, 12345, 2**31, 5001)
seq_pm = park_miller4(2222, 16807, 2**31 - 1, 5001)

x_lcg = seq_lcg[:-1]
y_lcg = seq_lcg[1:]

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

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')
axes[0].set_xlabel('Xi')
axes[0].set_ylabel('Xi+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='blue')
axes[1].set_title('Park-Miller')
axes[1].set_xlabel('Xi')
axes[1].set_ylabel('Xi+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()