Javascript Random (function) number distribution
The Javascript Math.random is very useful for generating random numbers. However, is the number distribution even across the range? This is important because a lot of websites implement this for various random things, such as banner rotation, etc. While it is best to do some of this logic at the server, sometimes its just easier to do this at the client using Javascript. Anyway this is a small test to check the distribution out. I did this because I created a samll random jeopardy website and wanted to make sure all of the “answers” had an even distribution.
To achieve this, I decided to use the command-line javascript as it is easier to do, without requiring a browser. So I installed spidermonkey for this.
Installing spidermonkey
See spidermonkey
The script
Below is the script I wrote to test this. In this test I am generating random numbers between 1 and 320 a total of 100,000,000 times and counting their occurance.
var dist = []; var rv; for (loopi = 1; loopi <= 320; loopi++) { dist[loopi]=0; } for (loopi = 0; loopi <= 100000000; loopi++) { rv=Math.floor(Math.random()*319)+1; //print(rv); dist[rv]=dist[rv]+1; } for (loopi = 1; loopi <= 320; loopi++) { print(loopi + " - " + dist[loopi]); }
Test
On running this very large sample set generation and distribution I found that the result was infact very evenly distributed. Here is the output to prove it. I thought of graphing it, but it is quite obvious just by observing the numbers that the distribution is quite even.
1 - 312999 2 - 313682 3 - 313696 4 - 313211 5 - 313773 6 - 313538 7 - 313230 8 - 314019 9 - 315107 10 - 313173 11 - 313186 12 - 312954 13 - 313650 14 - 313106 15 - 312534 16 - 313039 17 - 314425 18 - 311901 19 - 312643 20 - 313913 21 - 314109 22 - 312848 23 - 313484 24 - 312862 25 - 312730 26 - 314328 27 - 313142 28 - 313510 29 - 313830 30 - 313378 31 - 313414 32 - 314185 33 - 313059 34 - 313019 35 - 313368 36 - 312500 37 - 312859 38 - 313713 39 - 313394 40 - 313719 41 - 312837 42 - 312799 43 - 313907 44 - 312424 45 - 313071 46 - 313576 47 - 312796 48 - 313857 49 - 314417 50 - 313918 51 - 313099 52 - 313396 53 - 312824 54 - 313566 55 - 312437 56 - 313856 57 - 313413 58 - 313091 .....