import numpy as np # modul NumPy pro výpočty (zejména s poli, maticemi) import matplotlib.pyplot as plt # modul PyPlot pro kteslení grafů dim = 1000 x = np.empty(dim) # pole (0,0,...) dimenze dim y = np.empty(dim) col = np.empty(dim) #********************************************************** # test nativního generátoru modulu Numpy: for i in range(dim): # cyklus i = 0, 1,..., dim-1 x[i] = np.random.rand() # funkce rand() generuje číslo s rozdělením U(0,1) y[i] = np.random.rand() col[i] = np.random.rand() * 148 # bodový graf (scatter plot): plt.scatter(x,y,c=col,s=0.1) # parametr c = barva bodů, s = velikost bodů # můžeme (ale nemusíme) nastavit také nadpis grafu a popisky os: plt.title("Nativní generátor numpy (PCG64)" + "\nBarva bodů odpovídá X(i+2)") plt.xlabel("X(i)") plt.ylabel("X(i+1)") plt.show() #********************************************************** # test lineárních kongruentních generátorů: # nevhodné nastavení parametrů jako u generátoru RANDU: a = 65539 c = 0 m = pow(2,31) # příklad vhodného nastavení parametrů: #a = pow(7,5) #c = 0 #m = pow(2,31) - 1 # příklad s malým m (nastavte s=1 u plt.scatter): #b = 0 #m = 29 #a = 7 # krátká perioda - jen 7 opakujících se čísel #a = 3 # dlouhá perioda, ale korelace mezi X(i) a X(i+1) N = 11 # první číslo = seed for i in range(dim): N = (a * N + b) % m # N_i = (a N_i + b) mod m x[i] = N / m # do pole zapíšeme hodnotu mezi 0 a 1 N = (a * N + b) % m y[i] = N / m N = (a * N + b) % m col[i] = N / m plt.scatter(x,y,c=col,s=0.5) plt.title("Lineární kongruentní generátor, a = " + str(a) + ", b = " + str(b) + ", m = " + str(m) + "\nBarva bodů odpovídá X(i+2)") plt.xlabel("X(i)") plt.ylabel("X(i+1)") plt.show()