Respondiendo sólo a la primera de sus preguntas: "¿Qué pruebas aplicaría usted para determinar si este [secuencia] es verdaderamente aleatorio?"
¿Qué tal si lo tratamos como una serie temporal y comprobamos las autocorrelaciones? Aquí hay algo de código R. Primero algunos datos de prueba (primeros 1000 dígitos):
digits_string="1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989"
digits=as.numeric(unlist(strsplit(digits_string,"")))
Comprueba los recuentos de cada dígito:
> table(digits)
digits
0 1 2 3 4 5 6 7 8 9
93 116 103 102 93 97 94 95 101 106
A continuación, conviértalo en una serie temporal y ejecute la prueba de Box-Pierce:
d=as.ts( digits )
Box.test(d)
que me dice:
X-squared = 1.2449, df = 1, p-value = 0.2645
Normalmente, se desea que el valor p sea inferior a 0,05 para decir que hay autocorrelación.
Ejecutar acf(d)
para ver las autocorrelaciones. No he incluido una imagen aquí porque es un gráfico aburrido, aunque es curioso que los mayores desfases estén en 11 y 22. Ejecutar acf(d,lag.max=40)
para demostrar que no hay ningún pico en lag=33, ¡y que fue sólo una coincidencia!
P.D. Podríamos comparar lo bien que lo hicieron esos 1000 dígitos de pi, haciendo las mismas pruebas con números aleatorios reales.
probs=sapply(1:100,function(n){
digits=floor(runif(1000)*10)
bt=Box.test(ts(digits))
bt$p.value
})
Esto genera 1000 dígitos aleatorios, hace la prueba y la repite 100 veces.
> summary(probs)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.006725 0.226800 0.469300 0.467100 0.709900 0.969900
> sd(probs)
[1] 0.2904346
Así que nuestro resultado estaba cómodamente dentro de la primera desviación estándar, y pi grazna como un pato al azar. (He utilizado set.seed(1)
si quieres reproducir esos números exactos).