1. 均匀分布,使用线性同余器
from datetime import datetime
from math import sqrt, cos, pi, log
import matplotlib.pyplot as plt
import numpy as np
def uniform_gen(seed, a=0, b=1):
_A = 214013
_C = 214013
_M = 2 ** 32
while True:
seed = (_A * seed + _C) % _M
res = a + (b - a) * seed / _M
yield res
def random_uniform(num, seed=None):
res = []
if not seed:
seed = datetime.now().second
gen = uniform_gen(seed)
if num == 1:
return gen.__next__()
for i in range(num):
res.append(gen.__next__())
return np.array(res)
def plot_hist(x, bin=150, path = None):
plt.hist(x, bin)
if path:
plt.savefig(path)
plt.show()
res = random_uniform(10000)
plot_hist(res, 50, 'uniform.jpg')
2. Box-Muller变换正态分布
def box_muller(num, loc=0., scale=1.):
seed1 = datetime.now().second
seed2 = datetime.now().minute
gen1 = uniform_gen(seed1)
gen2 = uniform_gen(seed2)
res = []
for i in range(num):
u1 = gen1.__next__()
u2 = gen2.__next__()
u = sqrt(-2 * log(u1)