Pagina Principale

Estrazione di un numero naturale a caso

Un modo possibile per effettuare una estrazione casuale di un numero naturale
consiste nell'estrarne una prima cifra a caso tra 1 e 9 e poi,
ad esempio con probabilità , una prossima cifra tra 0 e 9 a destra della precedente.

Istogramma
Analisi Statistica
Leggi del caso

Your browser does not support canvas.

Possiamo determinare la probabilità che esca il numero $n$ come probabilità che il numero delle sue cifre sia $\lfloor Log\;n\rfloor+1$, la parte intera del suo logaritmo in base 10 aumentato di 1, moltiplicato per la probabilità di estrarre, con distribuzione uniforme, quel numero $n$ tra tutti i $10^{\lfloor Log\; n\rfloor+1}-10^{\lfloor Log\; n\rfloor}$ numeri con quella stessa lunghezza, ovvero $$p^{\lfloor Log\; n\rfloor}(1-p)\cdot\frac{1}{10^{\lfloor Log\; n\rfloor+1}-10^{\lfloor Log\; n\rfloor}}= \frac{1-p}{9}\left(\frac{p}{10}\right)^{\lfloor Log\; n\rfloor}.$$
Si osservi inoltre che $$\displaystyle \sum_{n=1}^\infty \left(\frac{p}{10}\right)^{\lfloor Log\; n\rfloor}\cdot \frac{1-p}{9} =\sum_{k=0}^\infty \left(\frac{p}{10}\right)^{k}\cdot \frac{1-p}{9}\cdot (10^{k+1}-10^k)= \sum_{k=0}^\infty p^{k}(1-p)=1.$$

Con Math.floor(Math.random()*10) si può produrre una cifra in modo pseudo-casuale con distribuzione approssimativamente uniforme.

var estr = "" + (Math.floor(Math.random()*9)+1); while (Math.random()<0.4) estr += Math.floor(Math.random()*10);
L’algoritmo non è definito nello standard; ogni motore JS (V8, SpiderMonkey, JavaScriptCore, Chakra) implementa il proprio PRNG (pseudorandom number generator), generatori veloci e abbastanza buoni per simulazioni o grafica, ma non hanno garanzie crittografiche, hanno periodicità finita (dopo un certo numero di chiamate i valori si ripetono), se conosci abbastanza output puoi stimare il seme e predire i successivi.