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 è voluto dimostrare l'aleatorietà delle traiettorie in un processo Markoviano. La direzione del movimento e la posizione successiva dipendono solo dallo stato attuale e non dalle traiettorie precedenti. Questa caratteristica rende i processi markoviani "senza memoria", il che significa che non è necessario mantenere un registro delle posizioni passate per determinare la posizione successiva. Pertanto, la traiettoria delle particelle in un processo markoviano può assumere qualsiasi forma. In generale, le particelle possono andare avanti e indietro tra le posizioni, saltare a posizioni casuali e accumulare posizioni casuali. Il progetto è composto da tre script, tutti con lo stesso scopo: verificare l'aleatorietà delle traiettorie per un processo Markoviano. In particolare, gli scrpit generano una lista di traiettorie casuali, dove ogni traiettoria è una lista di posizioni, e poi traccia queste traiettorie utilizzando la libreria Matplotlib. I programmi si differenziano per la dimesione in cui avviene il movimento, ovvero $1D$, $2D$ oppure $3D$. La funzione 'generate_random_trajectories(NUM_TRAJECTORIES, MAX_STEP)' genera una lista di traiettorie casuali. I parametri in ingresso 'NUM_TRAJECTORIES' e 'MAX_STEP' specificano rispettivamente il numero di traiettorie da generare e il numero massimo di passi per ogni traiettoria. Nel caso dello script $1D$, la funzione utilizza una lista di movimenti possibili (sinistra o destra), crea una lista vuota per contenere tutte le traiettorie e genera 'n_trajs' traiettorie casuali scegliendo casualmente una direzione in cui muoversi ad ogni passo. Per il $2D$, invece, oltre a generare uno spostamento casuale di $-1$ oppure $1$, si sceglie anche la direzione in modo casuale, ovvero se lungo l'asse $x$ oppure lungo l'asse $y$. Analogamente funziona lo script per il $3D$: si sceglie lo spostamento casuale tra $-1$ e $1$ e la direzione casuale tra $x$, $y$ e $z$. La funzione 'plot_trajectories(trajectories, MAX_STEP)' prende una lista di traiettorie e le traccia utilizzando 'Matplotlib'. Il parametro in ingresso 'MAX_STEP' specifica il numero di passi da effettuare per ogni traiettoria. La funzione traccia ciascuna traiettoria sulla base delle rispettive posizioni, utilizzando la funzione 'plot()' della libreria Matplotlib. Infine, la funzione 'main()' definisce il numero di traiettorie da generare e il numero massimo di passi per ogni traiettoria, e quindi chiama le funzioni generate_random_trajectories() e plot_trajectories() per generare e tracciare le traiettorie casuali.