Un altro modo possibile per ottenere una distribuzione discreta che assomiglia la distribuzione normale è quello di trarre da una distribuzione multinomiale dove le probabilità sono calcolate da una distribuzione normale.
import scipy.stats as ss
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 11)
xU, xL = x + 0.5, x - 0.5
prob = ss.norm.cdf(xU, scale = 3) - ss.norm.cdf(xL, scale = 3)
prob = prob/prob.sum() #normalize the probabilities so their sum is 1
nums = np.random.choice(x, size = 10000, p = prob)
plt.hist(nums, bins = len(x))
Qui, np.random.choice
raccoglie un intero da [-10, 10]. La probabilità di selezionare un elemento, ad esempio 0, è calcolata da p (-0.5 < x < 0.5) dove x è una variabile casuale normale con media zero e deviazione standard 3. Scelto std. dev. come 3 perché in questo modo p (-10 < x < 10) è quasi 1.
Il risultato assomiglia a questo:
La distribuzione normale è continua per definizione, quindi la risposta a questa domanda dipende da come lo vuoi discretizzare. Una possibile soluzione è campionare da 'np.random.normal' e arrotondare il risultato a un numero intero. –