Passeggiate casuali

Posizioni raggiunte in passeggiate senza memoria, a passo costante, simmetriche.

Il primo aspetto da approfondire analiticamente della passeggiata casuale dell'ubriaco è quello delle posizioni raggiunte dopo $n$ passi, una variabile aleatoria che possiamo indicare con $X_n$:

N° di passi valori di $X_n$: posizioni raggiunte
1 –1, +1
2 –2, 0 , +2
3 –3, –1, +1, +3
….  
$n = 2k$ $-n,-n+2,\dots,-4,-2,0,+2,+4,\dots,n-2,n$
$n=2k+1$ $-n,-n+2,\dots,-3,-1,+1,+3,\dots,n-2,n$

Ciascuna di queste posizioni può essere raggiunta seguendo percorsi diversi:

N° di passi N° di percorsi che conducono a ogni valore di $X_n$
1 1 , 1
2 1, 2 , 1
3 1, 3, 3, 1
….  
$n$ $1, C_{n,1}, C_{n,2}, C_{n,3}, ..., C_{n,n-3}, C_{n,n-2}, C_{n,n-1}, 1 $
dove i $C_{n,k}=C_{n-1,k-1}+C_{n-1,k}$ formano uno schema numerico molto noto, il triangolo di Pascal-Tartaglia, sono i coefficienti dello sviluppo del binomio $(1+x)^n$, le combinazioni di $n$ elementi presi $k$ alla volta.

Il numero totale di percorsi effettuabili con $n$ passi, la somma dei componenti la riga $n$-esima del triangolo di Pascal-Tartaglia, è $2^n$.

Nel modo più naturale, cioè ricorsivamente, questo schema, si può descrivere in javascript nel modo seguente:

function nPercorsi(n,x) { if ( n == 0 ) return 1 else if( n < Math.abs(x) ) return 0 else if( (n+Math.abs(x))%2 > 0 ) return 0 else if( n == Math.abs(x) ) return 1 else return nPercorsi(n-1,x-1) + nPercorsi(n-1,x+1) }
n=4

1
1,1
1,2,1
1,3,3,1
1,4,6,4,1

Si può ottenere anche iterando:

L = [...L,0].map((x, i) => x + [0,...L][i])
che data la lista $L$, inizialmente $L=[1]$, corrispondente a una riga dello schema, forma la lista corrispondente alla riga successiva sommando la lista $[0,...L]$, nella quale si antepone a $L$ l'elemento 0, con la lista $[...L,0]$, nella quale $L$ viene prolungata con uno zero finale.

Quindi

L = [1]; for (var k=0; k<n; k++) L = [...L,0].map((x, i) => x + [0,...L][i])
crea le prime $n+1$ righe.

Volendo inserire nello schema anche il numero, nullo, di percorsi per raggiungere posizioni pari per un numero dispari di passi o viceversa:

L = [1]; for(var i=0; i<n;i++){ L = [...L,0,0].map((x,k)=>x+[0,0,...L][k]); }

n=4

1
1,0,1
1,0,2,0,1
1,0,3,0,3,0,1
1,0,4,0,6,0,4,0,1

Lo schema del triangolo numerico di Pascal-Tartaglia si può ottenere anche per diagonali iterando:

diag.map((sum => value => sum += value)(0))
che produce somme cumulate a partire dalla diagonale formata di tutti 1.
diag = new Array(n+1).fill(1)
n=4
1 1 1 1 1
1 2 3 4
1 3 5
1 4
1

Il termine generico $C_{n,k}$, che si scrive anche $\binom{n}{k}$, si può ottenere calcolando $\frac{n!}{k!(n-k)!}=\frac{n(n-1)\cdots(n-k+1)}{k(k-1)\cdots 1}$. Con Javascript si può quindi ottenere anche nel modo seguente, arrotondando eventualmente il risultato:

C = 1; for (var i=1; i⁢=k; i++) C*=(n-k+i)/i;
oppure in una sola riga:
new Array(k).fill().reduce((num,e,i)=>num*=(n-k+1+i)/(i+1),1)

Così ad esempio $C\big($$\big)=$10

Particolarmente interessante è osservare che nello sviluppo di \[\displaystyle(x^{-1}+x)^n=\sum_{k=0}^n\binom{n}{k}x^{-n+k}x^{k}= \sum_{k=0}^n\binom{n}{k}x^{2k-n}=\sum_{\overset{n+X \text{ pari}}{X=-n}}^n\binom{n}{\frac{n+X}{2}}x^{X}\] gli esponenti di $x$ sono le posizioni raggiunte dopo gli $n$ passi mentre i coefficienti esprimono il numero di passeggiate diverse che conducono alla stessa posizione.

Se $n$ è il numero di passi, la posizione raggiunta è $X=2k-n,\quad \mbox{con}\;\; k\in\{0,1,2,...,n\}$ e il numero di percorsi possibili per raggiungerla è $\binom{n}{\frac{n+X}{2}}=\binom{n}{\frac{n-X}{2}}$.
Se poi indichiamo con $n_+$ il numero dei passi nel verso positivo e $n_-$ quello dei passi nel verso opposto, allora $\begin{cases}n_++n_-=n\\ n_+-n_-=X \end{cases}$ da cui $\begin{cases}n_+=\frac{n+X}{2}\\ n_-=\frac{n-X}{2} \end{cases}.$

In conclusione, la posizione raggiunta dopo $n$ passi è una variabile casuale $X_n$ che assume i valori \[-n, -n+1, \cdots, -1, 0, 1, \cdots, n-1, n\] e la cui distribuzione di probabilità, cioè la probabilità di raggiungere la posizione $x$ dopo $n$ passi, si può ottenere dividendo il numero di modi di raggiungere quella posizion per il numero totale $2^n$ di percorsi effettuabili. \[p(X_n=x)=\begin{cases}\binom{n}{\frac{n+x}{2}}\frac{1}{2^n} &\quad\mbox{se n+x è pari}\\ 0 &\quad\mbox{altrimenti}\end{cases}\]

Si può ottenere la distribuzione delle probabilità con una minima variazione del procedimento per determinare le righe del triangolo di Pascal-Tartaglia.

L = [1]; for (var k=0; k<n; k++) L = [...L,0].map((x, i) => (x + [0,...L][i])/2)
n=4

1
0.5,0.5
0.25,0.5,0.25
0.125,0.375,0.375,0.125
0.0625,0.25,0.375,0.25,0.0625
o anche
n=4

1
0.5,0,0.5
0.25,0,0.5,0,0.25
0.125,0,0.375,0,0.375,0,0.125
0.0625,0,0.25,0,0.375,0,0.25,0,0.0625

È più chiaro, poiché sintetico, rappresentare graficamente la legge di distribuzione della variabile $X_n$ mediante istogramma.

n=4

Possiamo poi mettere a confronto la distribuzione teorica con quella sperimentale ottenuta simulando passeggiate.
n=4

❮❮ ❯❯