<?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>LAMBDAPHONE &#187; pRNG</title>
	<atom:link href="http://coder.bsimmons.name/blog/tag/prng/feed/" rel="self" type="application/rss+xml" />
	<link>http://coder.bsimmons.name/blog</link>
	<description>fragmentary ideas  ䷿  intellectual what-nots  ䷷  and haskell programming  ䷴</description>
	<lastBuildDate>Tue, 27 Jul 2010 16:58:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Cycle Detection</title>
		<link>http://coder.bsimmons.name/blog/2009/04/cycle-detection/</link>
		<comments>http://coder.bsimmons.name/blog/2009/04/cycle-detection/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 05:35:09 +0000</pubDate>
		<dc:creator>jberryman</dc:creator>
				<category><![CDATA[haskell]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[pRNG]]></category>
		<category><![CDATA[recursion]]></category>

		<guid isPermaLink="false">http://coder.bsimmons.name/blog/?p=89</guid>
		<description><![CDATA[<h3>The Algorithm </h3>
<p>We can use <a href="http://en.wikipedia.org/wiki/Cycle_detection#Brent.27s_algorithm">Brent&#8217;s Algorithm</a> to detect infinitely-repeating sequences in a list of values generated by some iterated function: that is, any list in which the next value in the sequence is generated from the previous&#8230; <a href="http://coder.bsimmons.name/blog/2009/04/cycle-detection/" class="read_more">   [ R E A D &#124; M O R E ]</a></p>]]></description>
			<content:encoded><![CDATA[<h3>The Algorithm </h3>
<p>We can use <a href="http://en.wikipedia.org/wiki/Cycle_detection#Brent.27s_algorithm">Brent&#8217;s Algorithm</a> to detect infinitely-repeating sequences in a list of values generated by some iterated function: that is, any list in which the next value in the sequence is generated from the previous value alone; if we find duplicate values in the list, we know we have a cycle.</p>
<p>The implementation below isn&#8217;t particularly elegant, and since I want to use it as a stand-alone tool I&#8217;m having it output strings:</p>
<p><blockquote class="vimblock"><br>
<span class="Type">module</span>&nbsp;Main&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Type">where</span><br>
<br>
cycling&nbsp;<span class="Statement">::</span>&nbsp;(<span class="Type">Show</span>&nbsp;a,&nbsp;<span class="Type">Eq</span>&nbsp;a)&nbsp;<span class="Statement">=&gt;</span>&nbsp;<span class="Type">Int</span>&nbsp;<span class="Statement">-&gt;</span>&nbsp;[a]&nbsp;<span class="Statement">-&gt;</span>&nbsp;<span class="Type">String</span><br>
cycling&nbsp;k&nbsp;[]&nbsp;&nbsp;&nbsp;&nbsp; <span class="Statement">=</span>&nbsp;<span class="Constant">&quot;Empty list&quot;</span><br>
cycling&nbsp;k&nbsp;(a<span class="Statement">:</span>as)&nbsp;<span class="Statement">=</span>&nbsp;find&nbsp;<span class="Constant">0</span>&nbsp;a&nbsp;<span class="Constant">1</span>&nbsp;<span class="Constant">2</span>&nbsp;as<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Type">where</span>&nbsp;find&nbsp;_&nbsp;_&nbsp;c&nbsp;_&nbsp;&nbsp;[]&nbsp;<span class="Statement">=</span>&nbsp;<span class="Constant">&quot;reached end at &quot;</span>&nbsp;<span class="Statement">++</span>&nbsp;<span class="Identifier">show</span>&nbsp;c&nbsp;<span class="Statement">++</span><span class="Constant">&quot;: no cycles&quot;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find&nbsp;i&nbsp;x&nbsp;c&nbsp;p&nbsp;(x'<span class="Statement">:</span>xs)&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">|</span>&nbsp;c&nbsp;<span class="Statement">&gt;</span>&nbsp;&nbsp;k&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">=</span>&nbsp;&nbsp;<span class="Constant">&quot;no cycles after &quot;</span>&nbsp;<span class="Statement">++</span>&nbsp;<span class="Identifier">show</span>&nbsp;k<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">|</span>&nbsp;x&nbsp;<span class="Statement">==</span>&nbsp;x'&nbsp;&nbsp; <span class="Statement">=</span>&nbsp;&nbsp;<span class="Constant">&quot;cycle at &quot;</span><span class="Statement">++</span>&nbsp;<span class="Identifier">show</span>&nbsp;c&nbsp;<span class="Statement">++</span><span class="Constant">&quot;: &quot;</span><span class="Statement">++</span>(<span class="Identifier">show</span><span class="Statement">$</span><span class="Identifier">take</span>&nbsp;(c<span class="Statement">-</span>i)&nbsp;xs)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">|</span>&nbsp;c&nbsp;<span class="Statement">==</span>&nbsp;p&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">=</span>&nbsp;find&nbsp;c&nbsp;x' (c<span class="Statement">+</span><span class="Constant">1</span>)&nbsp;(p<span class="Statement">*</span><span class="Constant">2</span>)&nbsp;xs&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">|</span>&nbsp;<span class="Identifier">otherwise</span>&nbsp;<span class="Statement">=</span>&nbsp;find&nbsp;i&nbsp;x&nbsp;&nbsp;(c<span class="Statement">+</span><span class="Constant">1</span>)&nbsp;p&nbsp;xs<br>
<br>
&nbsp;&nbsp;<span class="Comment">--- SOME RANDOM NUMBER GENERATORS TO TEST ---</span><br>
<span class="Comment">-- bad generators?:</span><br>
g1&nbsp;<span class="Statement">=</span>&nbsp;<span class="Constant">0</span>&nbsp;<span class="Statement">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;(g<span class="Statement">*</span><span class="Constant">7</span>&nbsp;<span class="Statement">+</span>&nbsp;<span class="Constant">1</span>)&nbsp;&nbsp; <span class="Statement">`mod`</span>&nbsp;&nbsp; <span class="Constant">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="Statement">|</span>&nbsp;g&nbsp;<span class="Statement">&lt;-</span>&nbsp;g1]<br>
g2&nbsp;<span class="Statement">=</span>&nbsp;<span class="Constant">17</span>&nbsp;<span class="Statement">:</span>&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;(g<span class="Statement">*</span><span class="Constant">22</span>&nbsp;<span class="Statement">+</span>&nbsp;<span class="Constant">221</span>)&nbsp;&nbsp; <span class="Statement">`mod`</span>&nbsp;&nbsp;<span class="Constant">2</span><span class="Statement">^</span><span class="Constant">32</span>&nbsp;&nbsp; <span class="Statement">|</span>&nbsp;g&nbsp;<span class="Statement">&lt;-</span>&nbsp;g2]<br>
g3&nbsp;<span class="Statement">=</span>&nbsp;<span class="Constant">3249</span>&nbsp;<span class="Statement">:</span>&nbsp;&nbsp; [&nbsp;(g<span class="Statement">*</span><span class="Constant">22695477</span>&nbsp;<span class="Statement">+</span>&nbsp;<span class="Constant">1</span>)&nbsp;&nbsp;<span class="Statement">`mod`</span>&nbsp;<span class="Constant">300</span>&nbsp;&nbsp;<span class="Statement">|</span>&nbsp;g&nbsp;<span class="Statement">&lt;-</span>&nbsp;g3]<br>
g4&nbsp;<span class="Statement">=</span>&nbsp;<span class="Constant">234587</span>&nbsp;<span class="Statement">:</span>&nbsp;[&nbsp;(g<span class="Statement">*</span><span class="Constant">22695476</span>&nbsp;<span class="Statement">+</span>&nbsp;<span class="Constant">1</span>)&nbsp;<span class="Statement">`mod`</span>&nbsp;<span class="Constant">2</span><span class="Statement">^</span><span class="Constant">32</span>&nbsp;&nbsp;<span class="Statement">|</span>&nbsp;g&nbsp;<span class="Statement">&lt;-</span>&nbsp;g4]<br>
<br>
<span class="Comment">-- good generators:</span><br>
g5&nbsp;<span class="Statement">=</span>&nbsp;<span class="Constant">294587</span>&nbsp;<span class="Statement">:</span>&nbsp;[&nbsp;(g<span class="Statement">*</span><span class="Constant">22695477</span>&nbsp;<span class="Statement">+</span>&nbsp;<span class="Constant">1</span>)&nbsp;<span class="Statement">`mod`</span>&nbsp;<span class="Constant">2</span><span class="Statement">^</span><span class="Constant">32</span>&nbsp;&nbsp;<span class="Statement">|</span>&nbsp;g&nbsp;<span class="Statement">&lt;-</span>&nbsp;g5]<br>
g6&nbsp;<span class="Statement">=</span>&nbsp;<span class="Constant">0</span>&nbsp;<span class="Statement">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;(g<span class="Statement">*</span><span class="Constant">22695477</span>&nbsp;<span class="Statement">+</span>&nbsp;<span class="Constant">1</span>)&nbsp;<span class="Statement">`mod`</span>&nbsp;<span class="Constant">2</span><span class="Statement">^</span><span class="Constant">32</span>&nbsp;&nbsp;<span class="Statement">|</span>&nbsp;g&nbsp;<span class="Statement">&lt;-</span>&nbsp;g6]<br>
<br></blockquote></p>
<h3>Randomness is hard&#8230;</h3>
<p>Linear Congruential Generator&#8217;s are <a href="http://en.wikipedia.org/wiki/Linear_congruential_generator#Advantages_and_disadvantages_of_LCGs">notoriously easy to screw up</a> with the wrong parameters. Let&#8217;s use our function to test just how finicky this RNG algorithm can be. random stream <code>g4</code> is almost identical to <code>g5</code>, a known-good generator. Let&#8217;s compare the two with a cut off limit of 999,999. First the good:</p>
<blockquote><pre>*Main> cycling 999999 g5
"no cycles after 999999"</blockquote>
</pre>
<p>Great, now let&#8217;s see how our typo-ed generator fares:</p>
<blockquote><pre>*Main> cycling 999999 g4
"cycle at 17: [180790021]"</pre>
</blockquote>
<p>&#8230; yikes.</p>
]]></content:encoded>
			<wfw:commentRss>http://coder.bsimmons.name/blog/2009/04/cycle-detection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parallel List Comprehensions with a Monte Carlo example</title>
		<link>http://coder.bsimmons.name/blog/2009/04/parallel-list-comprehensions-with-a-monte-carlo-example/</link>
		<comments>http://coder.bsimmons.name/blog/2009/04/parallel-list-comprehensions-with-a-monte-carlo-example/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 19:42:55 +0000</pubDate>
		<dc:creator>jberryman</dc:creator>
				<category><![CDATA[haskell]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[pRNG]]></category>
		<category><![CDATA[recursion]]></category>

		<guid isPermaLink="false">http://coder.bsimmons.name/blog/?p=71</guid>
		<description><![CDATA[<p>GHC has an extension to the list comprehensions syntax that replicates the functionality of <code>zipWith</code>, by allowing you to have two generators running in parallel. Turn on the extension in GHCi like so:</p>
<blockquote><p><code>Prelude> :set -XParallelListComp</code></p></blockquote>
<p>I use the extension&#8230; <a href="http://coder.bsimmons.name/blog/2009/04/parallel-list-comprehensions-with-a-monte-carlo-example/" class="read_more">   [ R E A D &#124; M O R E ]</a></p>]]></description>
			<content:encoded><![CDATA[<p>GHC has an extension to the list comprehensions syntax that replicates the functionality of <code>zipWith</code>, by allowing you to have two generators running in parallel. Turn on the extension in GHCi like so:</p>
<blockquote><p><code>Prelude> :set -XParallelListComp</code></p></blockquote>
<p>I use the extension below to generate an infinite list of random coordinates (scaled to a  1000&#215;1000 grid) using two different  <a href="http://en.wikipedia.org/wiki/Linear_congruential_generator" target="_blank">Linear Congruential Generators </a>running in parallel. It should be simple to modify the code below to actually  run the generators concurrently using <a href="http://www.haskell.org/haskellwiki/GHC/Data_Parallel_Haskell" target="_blank">Data Parallel Haskell</a> (although I haven&#8217;t had a chance to play with that yet).</p>
<p><blockquote class="vimblock">
<br>
randPoints&nbsp;<span class="Operator">::</span>&nbsp;(<span class="Type">Integral</span>&nbsp;i)&nbsp;<span class="Operator">=&gt;</span>&nbsp;i&nbsp;<span class="Operator">-&gt;</span>&nbsp;[(i,i)]<br>
randPoints&nbsp;s&nbsp;<span class="Operator">=</span>&nbsp;<span class="Function">drop</span>&nbsp;<span class="Number">1</span>&nbsp;[&nbsp;(scale&nbsp;x,&nbsp;scale&nbsp;y)&nbsp;<span class="Operator">|</span>&nbsp;x&nbsp;<span class="Operator">&lt;-</span>&nbsp;g1&nbsp;<span class="Operator">|</span>&nbsp;y&nbsp;<span class="Operator">&lt;-</span>&nbsp;g2&nbsp;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Structure">where</span>&nbsp;<span class="Comment">-- two Linear Congruential Generators (from Borland C, glibc):</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g1&nbsp;<span class="Operator">=</span>&nbsp;s&nbsp;<span class="Operator">:</span>&nbsp;[&nbsp;(g<span class="Operator">*</span><span class="Number">22695477</span>&nbsp;<span class="Operator">+</span>&nbsp;<span class="Number">1</span>)&nbsp;&nbsp; <span class="Operator">`mod`</span>&nbsp;&nbsp; <span class="Number">2</span><span class="Operator">^</span><span class="Number">32</span>&nbsp;&nbsp; <span class="Operator">|</span>&nbsp;g&nbsp;<span class="Operator">&lt;-</span>&nbsp;g1]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2&nbsp;<span class="Operator">=</span>&nbsp;s&nbsp;<span class="Operator">:</span>&nbsp;[&nbsp;(g<span class="Operator">*</span><span class="Number">1103515245</span>&nbsp;<span class="Operator">+</span>&nbsp;<span class="Number">12345</span>)&nbsp;<span class="Operator">`mod`</span>&nbsp;<span class="Number">2</span><span class="Operator">^</span><span class="Number">32</span>&nbsp;<span class="Operator">|</span>&nbsp;g&nbsp;<span class="Operator">&lt;-</span>&nbsp;g2]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Comment">-- adjust the random output to fit a 1000x1000 plane:</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scale&nbsp;v&nbsp;<span class="Operator">=</span>&nbsp;(v&nbsp;<span class="Operator">`mod`</span>&nbsp;<span class="Number">1000</span>)&nbsp;<span class="Operator">-</span>&nbsp;<span class="Number">500</span><br>
<br>
</blockquote></p>
<p>Then we can use another list comprehension, this time with boolean guards, to generate random points that lie within an outer circle (and outside an inner circle):</p>
<p><blockquote class="vimblock">
<br>
monteDonut&nbsp;<span class="Operator">=</span>&nbsp;[p&nbsp;<span class="Operator">|</span>&nbsp;p<span class="Operator">@</span>(x,y)&nbsp;<span class="Operator">&lt;-</span>&nbsp;randPoints&nbsp;<span class="Number">42</span>,&nbsp;<span class="Statement">let</span>&nbsp;b<span class="Operator">=</span>&nbsp;x<span class="Operator">^</span><span class="Number">2</span><span class="Operator">+</span>y<span class="Operator">^</span><span class="Number">2</span>,&nbsp;b<span class="Operator">&lt;</span>&nbsp;<span class="Number">500</span><span class="Operator">^</span><span class="Number">2</span>,&nbsp;b<span class="Operator">&gt;</span>&nbsp;<span class="Number">10000</span>]<br>
<br>
</blockquote></p>
<p>Finally from GHCi we can use the <a href="http://hackage.haskell.org/packages/archive/gnuplot/0.3/doc/html/Graphics-Gnuplot-Simple.html" target="_blank">Gnuplot</a> library to easily plot the points we generated:</p>
<blockquote><p><code>*Main> :m + Graphics.Gnuplot.Simple<br />
*Main> plotDots [Aspect(Ratio 1), XTicks Nothing, YTicks Nothing] (take 10000 monteDonut)<br />
</code></p></blockquote>
<p>&#8230;and we get a nice Monte Carlo donut with sprinkles!:</p>
<img alt="random dot plot defining a circle" src="http://coder.bsimmons.name/blog/wp-content/out.png" title="Monte Carlo Donut" width="400" height="400" />
]]></content:encoded>
			<wfw:commentRss>http://coder.bsimmons.name/blog/2009/04/parallel-list-comprehensions-with-a-monte-carlo-example/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
