Il random walk, o "moto casuale" (conosciuto anche come "drunk man walk"), è un modello matematico che descrive il movimento di una particella o di un oggetto che si muove in modo casuale, senza una direzione o un pattern predefinito. In altre parole, ogni passo o spostamento che la particella compie è determinato casualmente, senza dipendere dal passo precedente. Le traiettorie caratterizzate dalla mancanza di uno schema o di una direzione chiari e possono essere influenzate da vari fattori o eventi casuali. Le traiettorie casuali possono essere osservate in vari campi, come la fisica, la biologia, la finanza e l'informatica, e sono spesso modellate utilizzando processi stocastici o distribuzioni di probabilità. Esempi di traiettorie casuali sono i movimenti delle particelle in un gas, i modelli di crescita delle colonie batteriche, le fluttuazioni dei prezzi delle azioni o il comportamento degli utenti su un sito web. Il random walk può essere utilizzato per descrivere il comportamento di una particella in un liquido o in un gas, o per analizzare l'andamento dei prezzi delle azioni in borsa. Il moto casuale può essere descritto attraverso una serie di passi, o step, che possono essere rappresentati da un processo di Markov. Un processo Markoviano (o catena di Markov) è un modello matematico che descrive l'evoluzione di una variabile casuale discreta nel tempo, in cui la probabilità della variabile al tempo $t+1$ dipende solo dal valore assunto al tempo $t$ (e non da tutti i valori precedenti). Una forma comune di random walk è il "random walk unidimensionale", in cui una particella si muove lungo una sola dimensione (ad esempio, l'asse $x$). In questo caso, la posizione della particella dopo n step può essere descritta dalla seguente formula:$$X_{n} = X_{0} + S_{1} + S_{2} + \ldots + S_{n}$$ dove $X_{0}$ è la posizione iniziale, $S_{1}$ , $S_{2}$ , ..., $S_{n}$ sono i passi successivi che la particella compie in modo casuale, e $X_{n}$ è la posizione dopo $n$ step. Il random walk è un modello molto semplice ma estremamente versatile, e viene utilizzato in molti campi della scienza e dell'economia.
Una delle implicazioni del random walk è che la posizione finale della particella è molto difficile da prevedere, poiché dipende dal risultato di una serie di eventi casuali. Tuttavia, è possibile calcolare alcune proprietà statistiche del random walk, come la media e la deviazione standard della posizione finale. In questo esempio si vuole andare a dimostrale la distribuzione della posizione finale in un random walk unidimensionale. Viene assunto che gli step del processo di random walk sono distribuiti in modo identico e indipendente con media zero e varianza $\sigma^{2}$. Si dimostra che la posizione finale $X_{n}$ segue una distribuzione gaussiana con media zero e varianza $n\cdot\sigma^{2}$:$$S_{n} \sim N\left(0, n\cdot\sigma^{2}\right)$$ Questo risultato può essere dimostrato usando il teorema del limite centrale, che stabilisce che la somma di n variabili casuali indipendenti e identicamente distribuite tende ad una distribuzione gaussiana quando n diventa grande. Ciò significa che la posizione finale del processo di random walk sarà distribuita intorno a zero, con una maggiore probabilità di rimanere vicino all'origine rispetto alle posizioni più estreme. La distribuzione della posizione finale è tende sempre allo stesso risultato, indipendentemente da come il processo Markoviano si è evoluto nel tempo, rendendola una distribuzione di equilibrio per il processo. Il programma calcola la distribuzione della posizione finale di un random walk di un processo Markoviano. In particolare, la funzione 'simulate_walk()' simula un random walk di lunghezza 'step'> e lo ripete 'limit' volte. La posizione finale di ogni random walk viene registrata nell'array 'walks', che ha dimensioni $(2*step+1, 2)$. La prima colonna di walks è una serie di valori interi che rappresentano la posizione finale possibile per il random walk, mentre la seconda colonna tiene traccia della frequenza con cui viene raggiunta ogni posizione finale. Dopo aver simulato tutti i random walk, la funzione normalizza le frequenze delle posizioni finali dividendo per il totale dei simulazioni limit. La funzione 'plot_distribution()' usa i dati ottenuti da simulate_walk() per plottare la distribuzione della posizione finale come un grafico a barre. Inoltre, calcola la distribuzione normale per una media uguale a $0$ e una deviazione standard uguale a $step^{1/2}$. La funzione plotta anche la distribuzione normale come una linea rossa sopra il grafico a barre. Infine, la funzione 'main()' esegue la simulazione e plotta la distribuzione risultante per un numero di passi step e una quantità di simulazioni limit fissati. Il programma utilizza il modulo 'numpy' per effettuare il calcolo vettoriale, il modulo 'matplotlib' per plottare i grafici.