Generating random numbers from a gamma distribution with python can be done through several methods:
Using numpy.random.gamma()
The most popular way is to use the NumPy library and its built-in function, numpy.random.gamma(). This function takes in two parameters - shape & scale - which are used to define the shape of the Gamma distribution that will be generated. Additionally, you can also set a size parameter to generate multiple random numbers at once.
import numpy as npshape = 3.0scale = 1.0nb_random_points = 10000data = np.random.gamma(shape, scale, nb_random_points)
Output
array([3.14118269, 5.10012155, 1.90110229, ..., 1.66629833, 0.51727531,0.37046791])import matplotlib.pyplot as pltimport numpy as npplt.hist(data, 100, density=True)plt.title('How to generate random numbers \n from a gamma distribution with python ?')plt.savefig("gamma_distribution_random_numbers_01.png", bbox_inches='tight',dpi=200, facecolor='white')plt.show()

Simulate a Gamma distribution using scipy’s stats module
Alternatively, you can simulate a Gamma distribution with Python using scipy’s stats module and its method called gamma(). This method accepts three parameters - shape, scale, and size - and it works similarly as the numpy method mentioned earlier.
import matplotlib.pyplot as pltimport numpy as npimport scipy.special as spsplt.hist(data, 100, density=True)X = np.linspace(0,16,100)PDF = ( 1.0 / ( sps.gamma(shape) * scale**shape) ) * X**(shape-1) * np.exp(-X/scale)plt.plot(X,PDF)plt.title('How to generate random numbers \n from a gamma distribution with python ?')plt.savefig("gamma_distribution_random_numbers_02.png", bbox_inches='tight',dpi=200, facecolor='white')plt.show()

Generate random numbers using the cumulative distribution function
To calculate the cumulative distribution function (CDF) of a gamma function a solution is to use scipy stats:
from scipy.stats import gammaplt.hist(data, 100, density=True)X = np.linspace(0,16,1000)CDF = gamma.cdf(X, shape, 0, scale)plt.plot(X,CDF)plt.title('How to generate random numbers \n from a gamma distribution with python ?')plt.xlim(0,16)plt.savefig("gamma_distribution_random_numbers_03.png", bbox_inches='tight',dpi=200, facecolor='white')plt.show()

Generating random numbers using the cumulative distribution function (CDF) involves assigning a probability to each outcome and then using the CDF to determine which value is chosen. To generate such a number, a user must first define the probability of each outcome, typically as a range from 0 to 1:
from scipy.optimize import minimizex = np.random.random_sample((10000,))y = np.zeros(x.shape)def diff(x,a):yt = gamma.cdf(x, shape, 0, scale)return (yt - a )**2for idx,x_value in enumerate(x):res = minimize(diff, 2, args=(x_value), method='Nelder-Mead', tol=1e-6)y[idx] = res.x[0]
Now let's create an histogram of random numbers using matplotlib:
plt.hist(y, 100, density=True)X = np.linspace(0,16,1000)X = np.linspace(0,16,100)PDF = ( 1.0 / ( sps.gamma(shape) * scale**shape) ) * X**(shape-1) * np.exp(-X/scale)plt.plot(X,PDF)plt.savefig("gamma_distribution_random_numbers_04.png", bbox_inches='tight',dpi=200, facecolor='white')plt.show()

References
| Links | Site |
|---|---|
| Random Generator | numpy.org |
| Gamma distribution | wikipedia |
| numpy.random.gamma | numpy.org |
| scipy.special.gammainc | docs.scipy.org |
| How to numerically compute the inverse function in python using scipy ? | moonbooks.org |
| cipy.stats.gamma | docs.scipy.org |
