Introduction : Qu’est-ce qu’une marche aléatoire ?
Une marche aléatoire est un processus mathématique décrivant un chemin composé d’une suite d’étapes aléatoires.
Imaginez que vous lanciez une pièce de monnaie — si c’est face, vous avancez ; si c’est pile, vous reculez.
Répétez cette expérience des centaines de fois, et vous obtiendrez ce qu’on appelle une marche aléatoire à une dimension (1D).
Les marches aléatoires apparaissent dans de nombreux domaines scientifiques :
- Biologie : modélisation de la diffusion moléculaire ou du déplacement cellulaire
- Finance : fluctuations des prix des actions
- Physique et météorologie : mouvement brownien, transport de polluants et turbulence atmosphérique
Bien que chaque marche soit imprévisible, lorsqu’on observe plusieurs marches aléatoires ensemble, des schémas émergent — comme le fait que la distance moyenne à l’origine croît avec la racine carrée du nombre d’étapes.
Table of contents
Une marche aléatoire simple en 1D
Commençons par le cas le plus simple — se déplacer aléatoirement vers la gauche ou la droite.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import numpy as np import matplotlib.pyplot as plt # Nombre d'étapes n_steps = 500 # Choisir aléatoirement les pas : +1 (droite) ou -1 (gauche) steps = np.random.choice([-1, 1], size=n_steps) # Calculer la position après chaque pas position = np.cumsum(steps) # Tracer la marche plt.figure(figsize=(10, 5)) plt.plot(position, lw=2, color='royalblue') plt.axhline(0, color='black', lw=1, linestyle='--') plt.title("Simulation d'une marche aléatoire 1D", fontsize=16) plt.xlabel("Numéro d'étape") plt.ylabel("Position") plt.grid(True, alpha=0.3) plt.show() |
Explications :
- Chaque pas est indépendant du précédent.
- Avec le temps, la position du marcheur “flotte” autour de zéro.
- En moyenne, la distance à l’origine croît comme ( \sqrt{N} ), où ( N ) est le nombre d’étapes.

Passer à deux dimensions (2D)
Étendons maintenant l’idée à deux dimensions — chaque pas a une direction aléatoire.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import numpy as np import matplotlib.pyplot as plt n_steps = 1000 # Angles aléatoires pour chaque pas (en radians) angles = np.random.uniform(0, 2 * np.pi, n_steps) x_steps = np.cos(angles) y_steps = np.sin(angles) # Calculer les positions cumulées x = np.cumsum(x_steps) y = np.cumsum(y_steps) # Tracer la trajectoire plt.figure(figsize=(6, 6)) plt.plot(x, y, lw=1.5, color='royalblue') plt.scatter(0, 0, color='green', label='Départ', zorder=3) plt.scatter(x[-1], y[-1], color='red', label='Arrivée', zorder=3) plt.title("Marche aléatoire 2D", fontsize=16) plt.xlabel("Position X") plt.ylabel("Position Y") plt.legend() plt.axis("equal") plt.grid(alpha=0.3) plt.show() |
Interprétation :
- Chaque pas a une longueur fixe mais une direction aléatoire.
- La trajectoire illustre la diffusion aléatoire de particules sur une surface.
- L’étalement (variance) augmente avec le nombre d’étapes.

Plusieurs marcheurs — Statistiques d’ensemble
Une seule marche est très bruitée. Simulons plusieurs marcheurs pour révéler le comportement statistique global.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import numpy as np import matplotlib.pyplot as plt n_walkers = 30 n_steps = 200 plt.figure(figsize=(8, 6)) for i in range(n_walkers): steps = np.random.choice([-1, 1], size=n_steps) position = np.cumsum(steps) plt.plot(position, alpha=0.5) plt.title("Ensemble de marches aléatoires 1D") plt.xlabel("Numéro d'étape") plt.ylabel("Position") plt.grid(alpha=0.3) plt.show() |
Observation :
- La position moyenne reste proche de zéro.
- La dispersion (variance) augmente avec le nombre d’étapes — une caractéristique typique de la diffusion.

Animation d’une marche aléatoire 2D (Matplotlib)
Les animations donnent vie aux marches aléatoires ! Visualisons la trajectoire qui se construit pas à pas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from IPython.display import HTML # Paramètres n_steps = 300 step_size = 1 # Initialisation x = np.zeros(n_steps) y = np.zeros(n_steps) # Directions aléatoires angles = np.random.uniform(0, 2*np.pi, n_steps-1) x[1:] = np.cumsum(np.cos(angles) * step_size) y[1:] = np.cumsum(np.sin(angles) * step_size) # Création de la figure fig, ax = plt.subplots(figsize=(6,6)) line, = ax.plot(x[:1], y[:1], lw=2, color='royalblue') point, = ax.plot([x[0]], [y[0]], 'ro', markersize=6) ax.set_xlim(x.min()-2, x.max()+2) ax.set_ylim(y.min()-2, y.max()+2) ax.set_title("Marche aléatoire 2D animée") ax.set_aspect('equal') ax.grid(True, alpha=0.3) # Fonction de mise à jour def update(frame): line.set_data(x[:frame+1], y[:frame+1]) point.set_data([x[frame]], [y[frame]]) # doit être une séquence return line, point # Création de l’animation ani = FuncAnimation(fig, update, frames=n_steps, interval=30, blit=True) # Affichage dans Jupyter HTML(ani.to_jshtml()) |

Visualisation interactive (Plotly)
Pour les présentations ou notebooks en ligne, Plotly permet d’explorer la marche de façon interactive.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import numpy as np import plotly.graph_objects as go n_steps = 500 angles = np.random.uniform(0, 2 * np.pi, n_steps) x = np.cumsum(np.cos(angles)) y = np.cumsum(np.sin(angles)) fig = go.Figure() fig.add_trace(go.Scatter( x=x, y=y, mode='lines+markers', line=dict(color='royalblue'), marker=dict(size=4, color='red'), name='Marche aléatoire' )) fig.update_layout( title="Marche aléatoire 2D interactive", xaxis_title="Position X", yaxis_title="Position Y", width=600, height=600, showlegend=False, template='plotly_white' ) fig.update_xaxes(scaleanchor="y", scaleratio=1) fig.show() |
L’interactivité apporte :
- Le zoom et le déplacement de la vue
- Des infobulles (coordonnées) au survol
- Une meilleure compréhension de la symétrie de diffusion

Résumé
| Concept | Ce que vous avez appris |
|---|---|
| Marche aléatoire 1D | Notion de mouvement aléatoire et somme cumulative |
| Marche aléatoire 2D | Extension à la diffusion spatiale |
| Multiples marcheurs | Comment le hasard se lisse statistiquement |
| Animation | Intuition visuelle du mouvement et de la diffusion |
| Interactivité | Exploration et apprentissage plus engageants |
Extensions à essayer
- Marche aléatoire biaisée – ajouter une légère dérive (ex.
+0.1à chaque pas). - Taille de pas variable – simuler la turbulence ou les vols de Lévy.
- Marche aléatoire 3D – utile pour la diffusion de particules ou les modèles atmosphériques.
- Analyse du déplacement quadratique moyen – vérifier la relation linéaire avec le nombre d’étapes.
Références
| Liens | Site |
|---|---|
| https://numpy.org/doc/stable/reference/random/index.html | Module NumPy Random (pour générer des pas aléatoires) |
| https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html | Fonction NumPy cumsum() pour les sommes cumulatives |
| https://matplotlib.org/stable/tutorials/introductory/pyplot.html | Bases de Matplotlib Pyplot |
| https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html | Documentation de la fonction plot() |
| https://matplotlib.org/stable/api/animation_api.html | Référence de l’API Animation de Matplotlib |
| https://matplotlib.org/stable/api/_as_gen/matplotlib.animation.FuncAnimation.html | Documentation officielle de FuncAnimation |
| https://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html#IPython.display.HTML | IPython HTML() pour afficher des animations dans Jupyter |
| https://jupyter.org/ | Page officielle du projet Jupyter |
