[ randint(0, 2) for i in range(20) ]
[ randrange(2) for i in range(20) ]
[ randrange(-12, 7, 4) for i in range(20) ]
Remarque : Dans beaucoup de structures finies (comme les listes, les ensembles finis, les graphes, etc.), il existe des fonctions de tirage uniforme déjà codées.
A = Zmod(17)
print(A)
print(A.random_element())
G = graphs.CompleteGraph(5)
show(G)
print(G.random_vertex())
Si l'on souhaite définir une variable aléatoire de distribution non-uniforme, on peut utiliser l'objet GeneralDiscreteDistribution(P)
où P
est la liste des probabilités de la distribution.
P = [0.2, 0.1, 0.7]
D = GeneralDiscreteDistribution(P)
[ D.get_random_element() for i in range(20) ]
La fonction uniform(a, b)
permet de tirer uniformément dans l'intevalle $[a, b[$.
uniform(1, 7)
La fonction RealDistribution
permet de définir quelques autres distributions. Par exemple, pour la distribution gaussienne centrée de variance sigma
:
sigma = 1
G = RealDistribution("gaussian", sigma)
La fonction de densité de probabilité est distribution_function()
, et la fonction de répartition est cum_distribution_function()
.
print(G.distribution_function(0), G.cum_distribution_function(0))
Pour la loi exponentielle, c'est un peu pénible, il faut passer par une loi plus générale appelée loi de Weibull, et fixer le second paramètre à $1$. Ainsi, pour la loi exponentielle de paramètre $\lambda = 0.5$ :
P = RealDistribution('weibull', [0.5, 1])
plot(P, xmin=0, xmax=4)
scipy.stats
¶Sagemath contient relativement peu de fonctions de probabilités/statistiques. Si l'on souhaite une utilisation plus avancée, il est conseillé d'utiliser le logiciel R
(qui est inclus dans Sagemath) ou le module stats
de la bibliothèque scipy
.
Le logiciel R
est assez complexe que vous aurez l'occasion de découvrir si vous poursuivez dans l'analyse de données, les statistiques, etc.
Voyons rapidement ce que l'on peut effectuer avec scipy.stats
.
Il faut d'abord importer la bibliothèque : import scipy.stats as sc
. Puis, s'offre à nous une quantité importante de fonctions (voyez en tapant sc.<tab>
). Par exemple pou r la loi binomiale avec $n = 12$ et $p = 0.2$ :
import scipy.stats as sc
b = sc.binom(12, 0.2)
bar_chart([b.pmf(k) for k in range(13)])
On voit que la fonction .pmf()
permet d'obtenir la distribution de la loi. On peut également obtenir la fonction de répartition par .cdf()
:
bar_chart([b.cdf(k) for k in range(13)])
Beaucoup d'autres valeurs sont disponibles : l'espérance par .mean()
ou .expect()
, la variance par .var()
, la mediane par .median()
, et les moments d'ordres quelconques par .moment(k)
.
Attention : les valeurs sont souvent arrondies et peut précises :
print(b.moment(2) - b.moment(1)**2, b.var())
Pour la loi normale centrée réduite :
c = sc.norm(0, 1)
plot(c.pdf, xmin=-4, xmax=4)