import numpy as np
import scipy.stats as st
import matplotlib.pyplot as plt
import time

N = [100, 1000, 10000, int(1e+5), int(1e+6), int(1e+7), int(1e+8)]
times = np.zeros((2, 7))
for i in range(len(N)):
	start = time.time()
	# 1st approach - Inverse CDF
	U = st.uniform.rvs(size = (N[i],))
	X1 = np.tan(np.pi*(U - 1./2))
	end1 = time.time()
	# 2nd approach
	Y1 = st.norm.rvs(size = (N[i],))
	Y2 = st.norm.rvs(size = (N[i],))
	X2 = Y1/Y2
	end2 = time.time()

    #plt.hist(X1, bins = 100, density = True, alpha = 0.5)
    #plt.hist(X2, bins = 100, density = True, alpha = 0.5)

#plt.show()
	times[0,i] = end1 - start
	times[1,i] = end2 - end1
	print( '-'*5 + str(N[i]) + ' samples ' + '-'*5)
	print( 'Inverse CDF method: ' + str(end1 - start))
	print( 'Gaussian ratio method: ' + str(end2 - end1))


plt.plot(N, times[0,:], '-x', label = 'Inverse CDF')
plt.plot(N, times[1,:], '-*', label = 'Gaussian ratio')
plt.xscale('log')
plt.yscale('log')
plt.legend()
plt.show()
