Есть проблема с вашим кодом, он делает равномерное распределение как
Я немного изменил вашу реализацию LCG, и все хорошо сейчас (Python 3,7, Анаконда, Win10 x64)
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
def lcg(n, x0, M=2**32, a=1103515245, c=12345):
result = np.zeros(n)
for i in range(n):
x0 = (a*x0 + c) % M
result[i] = x0
return np.array([x/float(M) for x in result])
#x = np.random.uniform(0.0, 1.0, 1000000)
x = lcg(1000000, 3)
print(stats.kstest(x, 'uniform'))
count, bins, ignored = plt.hist(x, 15, density=True)
plt.plot(bins, np.ones_like(bins), linewidth=2, color='r')
plt.show()
, которая печатает
KstestResult(statistic=0.0007238884545415214, pvalue=0.6711878724246786)
и графики
ОБНОВЛЕНИЕ
, как указывало @ p js, лучше делить на float (M) прямо в l oop, нет необходимости во втором проходе по всему массиву
def lcg(n, x0, M=2**32, a=1103515245, c=12345):
result = np.empty(n)
for i in range(n):
x0 = (a*x0 + c) % M
result[i] = x0 / float(M)
return result