Simulations

Here we have used “Python” but you may use whatever programming languages that can generate random numbers.

Bernoulli Random Walk

import numpy as np
import matplotlib.pyplot as plt
k = 2000 # number of samples
time_seq = np.arange(0, k)

# Sample a Bernoulli process with p=1/2
X = np.sign( np.random.uniform(-1, 1, k) )

plt.figure(0)
plt.plot(time_seq, X, 'bo')
plt.axis([0, k, -2, 2])
plt.xlabel('Time')
plt.ylabel('X[t]')
plt.grid()
plt.show(block=False)

# ===================================================================
# A random walk based on the Bernoulli process
S = np.zeros(k)
S[0] = X[0]
for itr in np.arange(1, k):
S[itr] = S[itr-1] + X[itr]

plt.figure(1)
plt.plot(time_seq, S)
#plt.axis([0, k, -2, 2])
plt.xlabel('Time')
plt.ylabel('S[t]')
plt.grid()
plt.show(block=False)

# ===================================================================
# Y[n] is a normalized version of S[n] by a factor of 1/n
Y = np.zeros(k)
for itr in np.arange(k):
Y[itr] = S[itr] / (itr+1)

plt.figure(2)
plt.plot(time_seq, Y)
#plt.axis([0, k, -2, 2])
plt.xlabel('Time')
plt.ylabel('Y[t]')
plt.grid()
plt.show(block=False)

# ===================================================================
# Z[n] is a normalized version of S[n] by a factor of 1/sqrt(n)
Z = np.zeros(k)
for itr in np.arange(k):
Z[itr] = S[itr] / np.sqrt(itr+1)

plt.figure(3)
plt.plot(time_seq, Z)
#plt.axis([0, k, -2, 2])
plt.xlabel('Time')
plt.ylabel('Z[t]')
plt.grid()
plt.show()


Central Limit Theorem

import numpy as np
import matplotlib.pyplot as plt

N = 10000  # number of independent sample paths
k = 4000  # number of samples in each sample path
time_seq = np.arange(0, k)

# ===================================================================
lst_Z_smpls = np.zeros(N)
for itr in np.arange(N):
    # Sample a Bernoulli process with p=1/2
    X = np.sign( np.random.uniform(-1, 1, k) )

    # A random walk based on the Bernoulli process
    S = np.zeros(k)
    S[0] = X[0]
    for jtr in np.arange(1, k):
        S[jtr] = S[jtr-1] + X[jtr]

    # Z[n] is a normalized version of S[n] by a factor of 1/sqrt(n)
    Z = np.zeros(k)
    for jtr in np.arange(k):
        Z[jtr] = S[jtr] / np.sqrt(jtr+1)

    lst_Z_smpls[itr] = Z[k-1]

plt.figure(0)
plt.hist(lst_Z_smpls, 100)
plt.grid()
plt.show()