Respondiendo solo la primera de tus preguntas: "¿Qué pruebas aplicarías para determinar si esta [secuencia] es verdaderamente aleatoria?"
¿Qué tal si lo tratamos como una serie temporal y si buscamos correlaciones automáticas? Aquí hay un código R. Primero algunos datos de prueba (primeros 1000 dígitos):
digits_string="1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989"
digits=as.numeric(unlist(strsplit(digits_string,"")))
Verifique 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
Luego conviértalo en una serie temporal y ejecute la prueba Box-Pierce:
d=as.ts( digits )
Box.test(d)
que me dice
X-squared = 1.2449, df = 1, p-value = 0.2645
Por lo general, desearía que el valor p sea inferior a 0.05 para decir que hay correlaciones automáticas.
Ejecute acf(d)
para ver las correlaciones automáticas. No he incluido una imagen aquí, ya que es un gráfico aburrido, aunque es curioso que los retrasos más grandes sean a las 11 y 22. Ejecutaracf(d,lag.max=40)
para mostrar que no hay pico en el retraso = 33, y que fue solo una coincidencia!
PD: Podríamos comparar qué tan bien lo hicieron esos 1000 dígitos de pi, haciendo las mismas pruebas en 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, realiza la prueba y repite esto 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
Entonces, nuestro resultado fue cómodamente dentro de la primera desviación estándar, y pi grazna como un pato al azar. (Solía set.seed(1)
si quieres reproducir esos números exactos).