Avec ce petit programme, on constate que l'égalité n'a pas lieu pour environ
un quart des triplets (a
, b
, c
) considérés.
Une version avec numpy
(pour une documentation en français, suivez
ce
lien. La bibliothèque numpy
n'est pas nécessairement incluse dans votre
distribution Python. Un « tutoriel »
pour installer des modules supplémentaires est disponible à la page
[Sources] → [Modules complémentaires]) :
from numpy import arange
def test_associativite(a,b,c) :
return (a+b)+c == a+(b+c)
compteur_assoc = 0
compteur_triplets = 0
for a in arange(0, 10, 0.1) :
for b in arange(0, 10, 0.1) :
for c in arange(0, 10, 0.1) :
compteur_assoc = compteur_assoc + test_associativite(a,b,c)
compteur_triplets += 1
print("Proportion de triplets pour lesquels (a+b)+c = a+(b+c) : ", compteur_assoc/compteur_triplets)
Le pourcentage obtenu n'est pas tout à fait le même que précédemment : c'est normal, la liste des nombres
0.1
, 0.2
, 0.3
, ... est ici obtenue en ajoutant le pas 0.1
(ce qui pose des problèmes d'arrondi), tandis que dans le code précédent, on obtenait ces nombres en
divisant par 10 des entiers. Les triplets intervenants dans les deux boucles ne sont donc pas les mêmes.
On explicite un peu les différences avec les codes ci-dessous :
- Le code :
from numpy import arange
Ln = list(arange(0, 10, 0.1))
print(Ln)
donne (début d'affichage) :
[0.0, 0.10000000000000001, 0.20000000000000001, 0.30000000000000004,
0.40000000000000002, 0.5, 0.60000000000000009,
0.70000000000000007, 0.80000000000000004, 0.90000000000000002, 1.0,
1.1000000000000001, 1.2000000000000002, 1.3, 1.4000000000000001, 1.5,
- Tandis que :
Lp = list( A/10 for A in range(0,100))
print(Lp)
donne (début d'affichage) :
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6,
0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5,