<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
I got hold of, and looked through the paper suggested in the root of
this thread <span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;">&#8220;<a
 href="http://portal.acm.org/citation.cfm?id=1746034">Pseudo random
trees in Monte-Carlo</a>", and based upon this<br>
I have thrown together a version of the binary tree based random number
generator suggested. <br>
<br>
I would like to point out that I do not know very much about random
number generators, the underlying mathematics or any subsequent papers
on this subject, this is just a very naive implementation based upon
this one paper. <br>
<br>
As a question, the following code actually generates a stream of
numbers that is more random than I was expecting, if anyone can explain
why I would be very interested.<br>
<br>
</span><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;"></span>
<div class="moz-text-flowed"
 style="font-family: -moz-fixed; font-size: 12px;" lang="x-western">import
System.Random
<br>
<br>
data LehmerTree = LehmerTree {nextInt :: Int,
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leftBranch :: LehmerTree,
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rightBranch :: LehmerTree}
<br>
<br>
instance Show LehmerTree where
<br>
&nbsp; show g = "LehmerTree, current root = "++(show $ nextInt g)
<br>
<br>
mkLehmerTree ::
Int-&gt;Int-&gt;Int-&gt;Int-&gt;Int-&gt;Int-&gt;LehmerTree
<br>
mkLehmerTree aL aR cL cR m x0 = innerMkTree x0
<br>
&nbsp; where
<br>
&nbsp;&nbsp;&nbsp; mkLeft x = (aL * x + cL) `mod` m
<br>
&nbsp;&nbsp;&nbsp; mkRight x = (aR * x + cR) `mod` m
<br>
&nbsp;&nbsp;&nbsp; innerMkTree x = let l = innerMkTree (mkLeft x)
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r = innerMkTree (mkRight x)
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in LehmerTree x l r
<br>
<br>
mkLehmerTreeFromRandom :: IO LehmerTree
<br>
mkLehmerTreeFromRandom = do gen&lt;-getStdGen
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let a:b:c:d:e:f:_ = randoms gen
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $ mkLehmerTree a b c d e f
<br>
<br>
instance RandomGen LehmerTree where
<br>
&nbsp; next g = (fromIntegral.nextInt $ g, leftBranch g)
<br>
&nbsp; split g = (leftBranch g, rightBranch g)
<br>
&nbsp; genRange _ = (0, 2147483562) -- duplicate of stdRange
<br>
<br>
<br>
<br>
test :: IO()
<br>
test = do gen&lt;-mkLehmerTreeFromRandom
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print gen
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let (g1,g2) = split gen
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let p = take 10 $ randoms gen :: [Int]
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let p' = take 10 $ randoms g1 :: [Int]
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- let p'' = take 10 $ randoms g2 :: [Float]
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print p
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print p'
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- print p''
<br>
<br>
<br>
</div>
</body>
</html>