'Sounds of Silence' Proving a Hit: World's Fastest Random Number Generator
<?xml version="1.0" encoding="UTF-8"?>
<!--Xholon Workbook http://www.primordion.com/Xholon/wb/ (C) Ken Webb Sat Apr 14 2012 21:18:30 GMT-0400 (EDT)-->
<XholonWorkbook>
<Notes><![CDATA[
Xholon
------
Title: 'Sounds of Silence' Proving a Hit: World's Fastest Random Number Generator
Description:
Url: http://www.sciencedaily.com/releases/2012/04/120413161235.htm
InternalName:
YoutubeId:
Keywords:
My Notes
--------
Science Daily has reprinted a news item from the Australian National University (ANU). Researchers have developed a "true" random number generator that measures quantum fluctuations in vaccuum::
http://news.anu.edu.au/?p=14431
http://photonics.anu.edu.au/qoptics/Research/qrng.php
http://150.203.48.55/index.php
In this workbook I will try to live stream random numbers from the ANU server, and graph the numbers to see if they fit a normal curve. Probably the simplest stream to work with is their hexadecimal (hex) stream::
http://150.203.48.55/RainHex.php
results after a few seconds look like this::
1bd69b93494a09046b6ccee66f7e5a135e46f8c2400ee384e312a8afccb3277628eb6c411a04f6ff29d0af4e954810d28ad12decb8f8ba26d4c0f912da118c22f1905e578c5cf45d412f49c17bfaa56e1c153a7e1d420476632b47ab55b0b7088c3a95ef68d4ebd963016758bf738b2747b7c1ae5f7589c3f07248ccb2a585532436c45799789db11aead86aa580f24fce4e7603dc4584ff07ce85e9e5f20044cfb8b55d73f1bbef33b26efbbcdd0190f7bcc90011af806a2db64c2f2da641c4f093c59d3c33972a8faa2beda5230fda364769b643f977da4656a166557458c0d1f4f85130042acdefa3530eee7821379305b65f773ce14c3cb591e7e29fb1dbb672
Hex numbers, widely used in computer work, are numbers in base 16. Everyday counting in base 10 looks like this ::
0 1 2 3 4 5 6 7 8 9
while counting in base 16 adds some extra digits ::
0 1 2 3 4 5 6 7 8 9 a b c d e f
With one decimal digit you can count from 0 to 9, while with two decimal digits (ex: 27) you can count from 0 to 99.
With one hex digit you can count from 0 to f, while with two hex digits (called a byte, ex: 1b) you can count from 0 to ff.
The ANU hex stream delivers one byte for each request, so there's a lot of traffic going back and forth between your web browser and the ANU server. The simplest approach is to let the server run for a minute or so, and then copy the output from the ANU generated page, to this workbook for processing.
Even easier and much faster is to request a block of hex numbers, which includes "1024 bytes of randomness in hexadecimal form" ::
http://150.203.48.55/RawHex.php
53c2ea686ef95b12b7ddb5e446fd1c0dec405d084ef4976a468626cad4c069fc539645b1bbfb8db56d6eea3259c46e6a8860ee9660ef70e904679667cbb7ac278278794732b8d1a483aa461954db433ad97bfe28c715d08f5a4d49e9badc6f6a4c0ffa73e7a3603d4a3849c254641666afdc3c9085409087158cd7d68128f5101c3d9b125d160fb6ca4e20b7fe485c163c17cb28ccf21e71ff23f27a37c8071013e88307df634322eb96935663965d81e0daa1568b48c8f1e00ffede791d352c8d738018aba339f218bbe356e0a989fcb92c57d7cfb33bc4e0dca7494087ae0870e6ff50f50a3355261cf9befa4dfba2051d3851ca727042ec0b5d024e1db7ca8852bf43566912b41331c15f1db2877cc8bd9f7b54acb2770d731d0885e1cccd943ea1393d15ec0d99469b6f146ed580b896ee67d912d921e126930eb3f42bcb461f37ea8d0387fee375bf204fbb0703c06c4ff7a9b94e2d7edeb79d5a87ac2f3b918cb3032d5f09e5ea80552e14f42ecb07aa755ef4275db3137d3badd7389ce5438fd2b39d7c7d7be3ccdfb4e301b805d8f3108d8e545d3ee4fcbf44a26092e63937faa38b535727cb8f4f60efb32653579b9e9f17c663bb0763ef37b2ad15dab665bc9677ceddb701bcd5d04e19042fd8c492bdf2ce69ca80bd3e49ee6ec0e7494a22006a860f5879a348f0365245e66c86ebfe26e33069c8933c0d63ac7d03f44ad43814bf34c6283e7f6747d434cea6b44199f3b85abe35ee7cca8507f816b6493f8c512871b80f6e09560259d3ff1015ab84feec49a88ec22c8e5a556a562db6ceaf541bfd899a66911a9e18ea84796ef9578447abb58eec0d3c55bbb62e11c1b9057b660408486918d9525d82ee1788d5bc68335f7d35aa2008cba21097cf2355ba27e64077bfe5c888e0e4139138901cdde5ae79a290bfeb56fc70c8c52515d541d9fabfe1e6dfc58f76842eb09ea1bc307edf2acc3be48c337d8e701ddcc183957180e18946ef2456b5944fb57a9ea33334490553a2f0c80330a25d8db2e07c2758bac67b30c820c64c6da267dc4b64804d2430b7fbf96422e285153fa34bb4c35b73c93efc3733383510ec94b62e7219fbf690b26d7eba1edd076c9ef89ae5166d6d7837f44278adc126a7f26a9f8eaddb7d42924086d4acd7d406249902bb380e5dce5674f061a0b737b00c05484fcad518a25e8ef10219900959fe088062e6f922b5dc07cf03b67bdb9ff8d124b2966da503b55ceaa7a2a833b9c937622886bc0ea6e92a202d7c33302811453dd8cc13122b6c9c10807e857b2357c3fcafced5694eb4e1b29b953d22b40378c79097335955094bde6629f3feb1fa11123e579b5677cfe867b1b33c123af3a8cd48a6dcda81de482848f77e389169d37dc9deda06913b7d9f6218f0d02d277d2c45efea4d418d47ac44c3f7e391
Here's another block ::
b87f45b427e3981800af5832920ca6b6d954077150e4fb26773a987e065a76ba775026ef0623e457ab7cfaf2610fd56d30e3fe07fb97c813a9c8ecd25c2a7badf42e65c3ea79abe5f46ee6bcc82b561408f6333f8e3e8d79dd948aac82c60eccc21a70331a495bedc04959ad0a372ce42835a82a670eb625e4cbeb9ebe3f0ad4cfdec993d6a0c6ce5d8015736eb41c2997982ee3281f5bcf9ce2c4f458d3f5e6dc782e73e7517dc8812ea898b126176cfaecf9d3bb221b3a724170ffdbfe66b0b8961085dd542f9b6c79a6ffa31c9d26c9895869d4f79c404b33cd05fb2d2610de9cf051d9dddfb6a86cf615bfda1ddd643a51f437814cba972f5023ed0c34442ca0e99044f7ac25ded6d48e19cc292b9323a857df2ae25ec2359d2eb24ae0fb25218b63fad9ed0cf010249f8bc21e8188631807a1621488c6c7bfd08e1deb0462cf7487e0fd9d6d3aa1e97d09dba1d0cfcdd240d67cbf1580b6c2cfe40883515e102f1bf1e00cb5e626891b5fc434d6c7731b9ebe05308bbe8d56f0effc59e26ab7295967908ada09c0308ea0a800442266d3846dba9f8f599b40835528e1a5618476917172064521a66c30887f1a4783ecba1a46614bc792a5eed3a8602414f0f427894546e3d7a374f43a1de1198c761ae207fd4901d7de5237ea075c44789dcda1334ef842209164ef11e883b81d5950ab1f736d84c836dcf1325672df0de4aa3077c1a3602e3aabbf3bee7fc568b2a08d1e410b12ec8be4a8c216c8d0ba892c670e138354a362019860e19f42f2ab3b96562f76fcf6d87cf3f06b0a9e03ce33ca1ec2d4c103692883d286ae5f5865a2dfc18f8d8323d9f04402a2e9e049b6ebd903e909712c4e6a0c03ea99274ccb14a4331c1d3b6444db6668b518b1770fb935cb8266921871128d827ac60f3c002157b5fd5243b7b03bba234cc302ed2ecada0c7d601340d8b4ad98d29f7cdc20bf3c8c4931cfa19aedcb2a5ccd6f3a7cf5bd1204702515f552d5c490c2a1dedb87b813f8b5035f2face74c4c4c3e6123912cdfeb72556495cae5eed1827d82d834e49c2240bf884c4ca8e721645509abb45972db5e7f742de49cd0bb27c37a09b94b54a5873de2a426e28a3dcdc0fbeaa45c631b01671d40fbfe670fa8262583617b8db7a61455308dd5230f7558a5fe81a0d06933c22ce76f287c7a088c7cf7854753cc7662ed589b711c55e36515b3a2d8eba6181bd7e181b2c4c0acfc3c3fa8db3bf297639b0fab1dea731e9671669a91e1674298f991055b3ca23ccab78f2ba93427cc911bc348b0b92029f6f027b866f129623dfcd3b18ba40dfd4dd51adf23967b2eddfaa506547d920da5e62672112274c331ee92048ae51450be1977aa60ea9de32885f6f4086f27d3033a1fead7fae59d2d2a0e89bf2e93c5328076931a2972134891f42bb063b625bae3
I'll graph this using the Raphael bar chart library, which unfortunately has little documentation so I don't know how to add labels. I would like to include the actual number below each bar.
About all I can say about the result is that it looks fairly uniform. There are about the same number of each of the 16 hexadecimal digits.
]]></Notes>
<script implName="lang:python:inline:"><![CDATA[
print "What's the hexadecimal equivalent of 99 bottles of beer on the wall?"
]]></script>
<script implName="lang:javascript:inline:"><![CDATA[
print("Maybe ff buckets of bits on the floor.\n");
]]></script>
<_-.XholonClass>
<!-- types of domain objects -->
<RandomnessSystem/>
<Randomness/>
<Block/>
</_-.XholonClass>
<xholonClassDetails>
</xholonClassDetails>
<RandomnessSystem>
<Randomness>
<!-- the first character in Block is non-numeric (_) so JavaScript will treat it as a string -->
<Block>_b87f45b427e3981800af5832920ca6b6d954077150e4fb26773a987e065a76ba775026ef0623e457ab7cfaf2610fd56d30e3fe07fb97c813a9c8ecd25c2a7badf42e65c3ea79abe5f46ee6bcc82b561408f6333f8e3e8d79dd948aac82c60eccc21a70331a495bedc04959ad0a372ce42835a82a670eb625e4cbeb9ebe3f0ad4cfdec993d6a0c6ce5d8015736eb41c2997982ee3281f5bcf9ce2c4f458d3f5e6dc782e73e7517dc8812ea898b126176cfaecf9d3bb221b3a724170ffdbfe66b0b8961085dd542f9b6c79a6ffa31c9d26c9895869d4f79c404b33cd05fb2d2610de9cf051d9dddfb6a86cf615bfda1ddd643a51f437814cba972f5023ed0c34442ca0e99044f7ac25ded6d48e19cc292b9323a857df2ae25ec2359d2eb24ae0fb25218b63fad9ed0cf010249f8bc21e8188631807a1621488c6c7bfd08e1deb0462cf7487e0fd9d6d3aa1e97d09dba1d0cfcdd240d67cbf1580b6c2cfe40883515e102f1bf1e00cb5e626891b5fc434d6c7731b9ebe05308bbe8d56f0effc59e26ab7295967908ada09c0308ea0a800442266d3846dba9f8f599b40835528e1a5618476917172064521a66c30887f1a4783ecba1a46614bc792a5eed3a8602414f0f427894546e3d7a374f43a1de1198c761ae207fd4901d7de5237ea075c44789dcda1334ef842209164ef11e883b81d5950ab1f736d84c836dcf1325672df0de4aa3077c1a3602e3aabbf3bee7fc568b2a08d1e410b12ec8be4a8c216c8d0ba892c670e138354a362019860e19f42f2ab3b96562f76fcf6d87cf3f06b0a9e03ce33ca1ec2d4c103692883d286ae5f5865a2dfc18f8d8323d9f04402a2e9e049b6ebd903e909712c4e6a0c03ea99274ccb14a4331c1d3b6444db6668b518b1770fb935cb8266921871128d827ac60f3c002157b5fd5243b7b03bba234cc302ed2ecada0c7d601340d8b4ad98d29f7cdc20bf3c8c4931cfa19aedcb2a5ccd6f3a7cf5bd1204702515f552d5c490c2a1dedb87b813f8b5035f2face74c4c4c3e6123912cdfeb72556495cae5eed1827d82d834e49c2240bf884c4ca8e721645509abb45972db5e7f742de49cd0bb27c37a09b94b54a5873de2a426e28a3dcdc0fbeaa45c631b01671d40fbfe670fa8262583617b8db7a61455308dd5230f7558a5fe81a0d06933c22ce76f287c7a088c7cf7854753cc7662ed589b711c55e36515b3a2d8eba6181bd7e181b2c4c0acfc3c3fa8db3bf297639b0fab1dea731e9671669a91e1674298f991055b3ca23ccab78f2ba93427cc911bc348b0b92029f6f027b866f129623dfcd3b18ba40dfd4dd51adf23967b2eddfaa506547d920da5e62672112274c331ee92048ae51450be1977aa60ea9de32885f6f4086f27d3033a1fead7fae59d2d2a0e89bf2e93c5328076931a2972134891f42bb063b625bae3</Block>
</Randomness>
</RandomnessSystem>
<Blockbehavior implName="lang:python:inline:"><![CDATA[
]]></Blockbehavior>
<Blockbehavior implName="lang:javascript:inline:"><![CDATA[
]]></Blockbehavior>
<Randomnessbehavior implName="lang:webEditionjs:inline:"><![CDATA[
function postConfigure() {
this.xholoncreationservice('requireScript', 'raphael-min.js');
this.xholoncreationservice('requireScript', 'g.raphael-min.js');
this.xholoncreationservice('requireScript', 'g.bar-min.js');
}
function act() {
var block = this.parent().children(".Block");
var bytes = block.attr('val_string').substring(1); // remove the first character _
print("\n" + bytes);
print("\nThere are " + (bytes.length >> 1) + " bytes in the ANU block.");
var bucket = new Array(16);
for (var i = 0; i < bucket.length; i++) {
bucket[i] = 0;
}
for (var j = 0; j < bytes.length; j++) {
var nibble = bytes.charAt(j);
switch(nibble) {
case '0': bucket[0]++; break;
case '1': bucket[1]++; break;
case '2': bucket[2]++; break;
case '3': bucket[3]++; break;
case '4': bucket[4]++; break;
case '5': bucket[5]++; break;
case '6': bucket[6]++; break;
case '7': bucket[7]++; break;
case '8': bucket[8]++; break;
case '9': bucket[9]++; break;
case 'a': bucket[10]++; break;
case 'b': bucket[11]++; break;
case 'c': bucket[12]++; break;
case 'd': bucket[13]++; break;
case 'e': bucket[14]++; break;
case 'f': bucket[15]++; break;
default: break;
}
}
var mySVGDiv = $("div#mySVGDiv");
mySVGDiv.empty();
var r = Raphael(mySVGDiv[0], 320, 240);
var barchart = r.barchart(10,10,300,220, bucket);
barchart.attr("fill", "blue");
}
]]></Randomnessbehavior>
<Blockbehavior implName="lang:bsh:inline:"><![CDATA[
]]></Blockbehavior>
<Blockbehavior implName="lang:jruby:inline:"><![CDATA[
]]></Blockbehavior>
<Blockbehavior implName="lang:groovy:inline:"><![CDATA[
]]></Blockbehavior>
<SvgClient><Attribute_String roleName="svgUri"><![CDATA[data:image/svg+xml,
<svg width="100" height="50" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Randomness</title>
<rect id="RandomnessSystem/Randomness" fill="#98FB98" height="50" width="50" x="25" y="0"/>
</g>
</svg>
]]></Attribute_String><Attribute_String roleName="setup">${MODELNAME_DEFAULT},${SVGURI_DEFAULT}</Attribute_String></SvgClient>
</XholonWorkbook>