Function Repository Resource:

SerialRandomnessTest

Source Notebook

Conduct an empirically derived test that assesses randomness using the frequencies of serial combinations of 0s and 1s

Contributed by: Emmy/Noah Blumenthal
noahb320@gmail.com
emmyb320@bu.edu

ResourceFunction["SerialRandomnessTest"][sequence]

conducts an empirically derived test using the frequencies of serial combinations of 0s and 1s in sequence and returns an associated p-value.

ResourceFunction["SerialRandomnessTest"][sequence,"properties"]

conducts an empirically derived test and returns the specified property.

Details and Options

Properties include:
"TestStatistic"returns the test statistic
"PValue"returns the p-value associated with the test
The test statistic is generated by creating a chi-square-like statistic that compares the frequencies of subsequences of 0s and 1s of length two to the expected frequencies.
The test works only for sequences of 0s and 1s.
ResourceFunction["SerialRandomnessTest"] results are generally invalid for sequence lengths shorter than 100.

Examples

Basic Examples (3) 

Generate a sequence of random integers:

In[1]:=
sequence = RandomInteger[{0, 1}, 1000];

Visualize the sequence:

In[2]:=
ArrayPlot[Partition[sequence, 16]\[Transpose], Sequence[
 ImageSize -> Large, ColorFunction -> "CandyColors"]]
Out[2]=

Apply a runs-based test:

In[3]:=
ResourceFunction["SerialRandomnessTest"][sequence, "TestStatistic"]
Out[3]=
In[4]:=
ResourceFunction["SerialRandomnessTest"][sequence, "PValue"]
Out[4]=

Applications (2) 

Generate a sequence of random integers:

In[5]:=
subsequence = RandomInteger[{0, 1}, 10];
In[6]:=
sequence = Flatten@Table[subsequence, 20];

Visualize the sequence:

In[7]:=
ArrayPlot[Partition[sequence, 16]\[Transpose], Sequence[
 ImageSize -> Large, ColorFunction -> "CandyColors"]]
Out[7]=

Attempt to reject a non-random sequence:

In[8]:=
ResourceFunction["SerialRandomnessTest"][sequence, "TestStatistic"]
Out[8]=
In[9]:=
ResourceFunction["SerialRandomnessTest"][sequence, "PValue"]
Out[9]=

Test the randomness of rule 30:

In[10]:=
rule30seq = CellularAutomaton[30, {{1}, 0}, {100000, 0}]\[Transpose][[1]];
In[11]:=
ArrayPlot[Partition[Take[rule30seq, 1000], 16]\[Transpose], Sequence[
 ColorFunction -> "CandyColors", ImageSize -> Large]]
Out[11]=
In[12]:=
ResourceFunction["SerialRandomnessTest"][rule30seq]
Out[12]=

Possible Issues (1) 

SerialRandomnessTest requires sequences of length 100 or more:

In[13]:=
ResourceFunction["SerialRandomnessTest"][RandomInteger[{0, 1}, 50]]

Neat Examples (1) 

Visualize the sampling distribution of the test statistic:

In[14]:=
samp = Table[
   ResourceFunction["SerialRandomnessTest"][
    RandomInteger[{0, 1}, 1000], "TestStatistic"], 1000];
In[15]:=
Histogram[samp, Automatic, "PDF"]
Out[15]=
In[16]:=
estdist = FindDistribution[samp, TargetFunctions -> {GammaDistribution}]
Out[16]=
In[17]:=
Show[Histogram[samp, Automatic, "PDF"], Plot[PDF[estdist, x], {x, 0, 10}, PlotRange -> All]]
Out[17]=

Publisher

Emmy Blumenthal

Version History

  • 1.0.0 – 08 July 2019

Source Metadata

Related Resources

Author Notes

This test is entirely derived form the NIST publication.

License Information