Répondez à la première de vos questions: "Quels tests appliqueriez-vous pour déterminer si cette [séquence] est vraiment aléatoire?"
Pourquoi ne pas le traiter comme une série temporelle et vérifier les corrélations automatiques? Voici du code R. Quelques données de test (1000 premiers chiffres):
digits_string="1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989"
digits=as.numeric(unlist(strsplit(digits_string,"")))
Vérifiez les comptes de chaque chiffre:
> table(digits)
digits
0 1 2 3 4 5 6 7 8 9
93 116 103 102 93 97 94 95 101 106
Puis convertissez-le en une série chronologique et exécutez le test Box-Pierce:
d=as.ts( digits )
Box.test(d)
qui me dit:
X-squared = 1.2449, df = 1, p-value = 0.2645
En règle générale, vous voudriez que la valeur p soit inférieure à 0,05 pour indiquer qu'il existe des corrélations automatiques.
Exécuter acf(d)
pour voir les corrélations automatiques. Je n'ai pas inclus d'image ici car il s'agit d'un tableau plat, bien qu'il soit curieux que les plus grands décalages se situent à 11 et 22 ans. Exécuter acf(d,lag.max=40)
pour montrer qu'il n'y a pas de pic à décalage = 33, et que c'était juste une coïncidence!
PS Nous pourrions comparer l’efficacité de ces 1000 chiffres de pi en effectuant les mêmes tests sur des nombres aléatoires réels.
probs=sapply(1:100,function(n){
digits=floor(runif(1000)*10)
bt=Box.test(ts(digits))
bt$p.value
})
Cela génère 1000 chiffres aléatoires, effectue le test et le répète 100 fois.
> 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
Donc, notre résultat était confortablement dans le premier écart-type, et pi charlatans comme un canard aléatoire. (J'ai utilisé set.seed(1)
si vous voulez reproduire ces chiffres exacts.)