Загрузка данных
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()