Dependencies: GD, libpng
Development Progress: (github)
Latest Stable Release: 1.3 (Download)
AboutSpectra is a very simple tool I have written to aid in the development and testing of random number generators. By visualizing random data, Spectra is able to help detect repeating patterns in streams of random data by using the most powerful computer in the known world, your brain. Spectra first generates an image based on the data contained in the input file, and then counts the occurrences of each ASCII character. While this is by no means an exhaustive examination of the data, it does give you a reference point when working with ASCII files.
UsageUsing Spectra is very simple, you just give it an input file and wait a few seconds. Ideally you should give it width and height dimensions to use for the generated image with the "-x" and "-y" options respectively, but even that is optional. Just understand that the smaller the image, the less accurate the results will be. The default image size is 640x480, which gives you a sample size of 307,200 digits, which is not a whole lot in the statistical sense. Comparatively, if you give that HDTV of yours a workout and generate an image at 1920x1080, you will have analyzed 2,073,600 digits, a much more respectable number. Processing time is very slight even on low-end hardware, so don't be afraid to aim high.
For a quick example, let's see what we get when we put a sample ASCII file from Random.org:
Here you can see that the occurrences look pretty close to equal, so we got a good look at the bias. As I said, with this small of a sample it is unwise to draw too many conclusions, but at least it isn't wildly skewed. Of course, the occurrence counts aren't the main attraction, so let's look at the output file itself:
bash:~# spectra -i ./2009-11-08.txt Spectra - Version 1.0 --------------------------- Opening input file: ./2009-11-08.txt...OK Creating output file: output.png...OK Dimensions: 640x480 Generating image...Done Image Analysis --------------------------- Occurrences out of 307200: Character: 0 - 153955 Character: 1 - 154366 Closing files... Flushing memory... Done.
You can plainly see there is no discernible pattern in the image, which is another good sign. Spectra is also able to generate colored images if the input data contains ASCII values 0 to 9 rather than just 0 and 1. This can help with the visual identification of bias, though I imagine you need to have relatively good eyesight to make use of it. For instance, the red-yellowish overall look of this image shows the low-number bias found in early tests of bt_rng:
For reference, here is an example of what a terrible RNG looks like. For this example I wrote up a quick program that got a random number between 0 and 9 with the standard rand() call, and depending on the number would write out 1 of 10 possible strings of 0's and 1's. So this is a (relatively) random data source, but being output with predictable patterns. Let's take a look:
If you ever see output like that on a production device or server: run away, quickly.