Are the digits of $\pi$ statistically random?

Suppose you observe the sequence:

7, 9, 0, 5, 5, 5, 4, 8, 0, 6, 9, 5, 3, 8, 7, 8, 5, 4, 0, 0, 6, 6, 4, 5 , 3, 3, 7, 5, 9, 8, 1, 8, 6, 2, 8, 4, 6, 4, 1, 9, 9, 0, 5, 2, 2, 0, 4, 5, 2, 8 ...

What statistically tests would you apply to determine if this is truly random? FYI these are the $n$th digits of $\pi$. Thus, are digits of $\pi$ statistically random? Does this say anything about the constant $\pi$?

-
– ocram Nov 26 '12 at 17:24
– user10525 Nov 26 '12 at 17:35
This is an interesting and maddening question. Any student that has taken a first course in measure-theoretic probability can easily prove that "almost all" real numbers are normal. But very few explicit examples are known, and to my (off-hand) knowledge, the matter has not been settled either way for any of the "famous" irrational mathematical constants. – cardinal Nov 26 '12 at 17:45
In (strict) connection with @cardinal's comment: Normal number – user10525 Nov 26 '12 at 17:52
What's the graph? There are ten bars, oddly spaced, and all with values above 10%! – xan Nov 29 '12 at 22:53

The US National Institute of Standard has put together a battery of tests that a (pseudo-)random number generator must pass to be considered adequate, see http://csrc.nist.gov/groups/ST/toolkit/rng/stats_tests.html. There are also tests known as the Diehard suite of tests, which overlap somewhat with NIST tests. Developers of Stata statistical package report their Diehard results as a part of their certification process. I imagine you can take blocks of digits of $\pi$, say in groups of consecutive 15 digits, to be comparable to the double type accuracy, and run these batteries of tests on thus obtained numbers.

-

Answering just the first of your questions: "What tests would you apply to determine if this [sequence] is truly random?"

How about treating it as a time-series, and checking for auto-correlations? Here is some R code. First some test data (first 1000 digits):

digits_string="1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989"
digits=as.numeric(unlist(strsplit(digits_string,"")))


Check the counts of each digit:

> table(digits)
digits
0   1   2   3   4   5   6   7   8   9
93 116 103 102  93  97  94  95 101 106


Then turn it into a time-series, and run the Box-Pierce test:

d=as.ts( digits )
Box.test(d)


which tells me:

X-squared = 1.2449, df = 1, p-value = 0.2645


Typically you'd want the p-value to be under 0.05 to say there are auto-correlations.

Run acf(d) to see the auto-correlations. I've not included an image here as it is a dull chart, though it is curious that the biggest lags are at 11 and 22. Run acf(d,lag.max=40) to show that there is no peak at lag=33, and that it was just coincidence!

P.S. We could compare how well those 1000 digits of pi did, by doing the same tests on real random numbers.

probs=sapply(1:100,function(n){
digits=floor(runif(1000)*10)
bt=Box.test(ts(digits))
bt\$p.value
})


This generates 1000 random digits, does the test, and repeats this 100 times.

> 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


So our result was comfortably within the first standard deviation, and pi quacks like a random duck. (I used set.seed(1) if you want to reproduce those exact numbers.)

-