from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
This happens num_iter
times and an array of results are returned
def sumToOne(num_iter):
'''
sum up random samples until you reach 1,
return the array of the number of samples required
'''
num_samples = np.empty((num_iter,))
for k in range(num_iter):
total = 0
ns = 0
while total <= 1:
total += np.random.uniform(0,1)
ns += 1
num_samples[k] = ns
return num_samples
def plot_e_guesses(num_trials, num_samples):
'''plot the results from estimated `e`'''
fig, ax1 = plt.subplots(figsize=(6,4), dpi=300)
ax1.plot(num_trials, num_samples, '.', markersize=4, markeredgecolor='k',
markerfacecolor='k', alpha=0.87, zorder=5, label='Average values')
ax1.axhline(np.e, color='b', linewidth=1.25, alpha=0.75,
zorder=0, label=r'e = %0.10f' % (np.e,))
ax1.set_ylim([2.5,3.0])
ax1.set_xlabel('Number of iterations')
ax1.set_ylabel('Avg. number of samples to reach 1')
ax1.legend(loc='lower right')
ax1.set_xscale('log')
ax1.xaxis.grid(True, which='major', linestyle='-', alpha=0.35)
ax1.xaxis.grid(True, which='minor', linestyle='-', alpha=0.20)
ax1.yaxis.grid(True, which='major', linestyle='-', alpha=0.35)
num_samples = np.array([])
num_trials = np.logspace(2,6,100)
for nt in num_trials:
ns = sumToOne(int(nt))
num_samples = np.hstack([num_samples, np.mean(ns)])
plot_e_guesses(num_trials, num_samples)