<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">I had the same thought, since my interval [1..10000] is rather large.<div><br></div><div>Thanks,</div><div><br></div><div>MIchael<br><br>--- On <b>Tue, 6/14/11, Jonas Almström Duregård <i>&lt;jonas.duregard@chalmers.se&gt;</i></b> wrote:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Jonas Almström Duregård &lt;jonas.duregard@chalmers.se&gt;<br>Subject: Re: [Haskell-cafe] Acquiring a random set of a specific size (w/o dups) from a range of Ints<br>To: "michael rice" &lt;nowgate@yahoo.com&gt;<br>Cc: "Felipe Almeida Lessa" &lt;felipe.lessa@gmail.com&gt;, haskell-cafe@haskell.org<br>Date: Tuesday, June 14, 2011, 5:17 AM<br><br><div id="yiv1111071637"><div><div class="yiv1111071637im" style="font-size:medium;"><div style="font-size:10pt;"><span style="font-size:14px;line-height:16px;"><font
 class="yiv1111071637Apple-style-span" face="verdana, sans-serif">&gt; Shuffle [1..20], then take 5?</font></span></div>
<div style="font-size:10pt;"><font class="yiv1111071637Apple-style-span" face="verdana, sans-serif"><span class="yiv1111071637Apple-style-span" style="font-size:14px;line-height:16px;">&gt; Yes, so</span><span class="yiv1111071637Apple-style-span" style="font-size:14px;line-height:16px;"> simple, I'm embarrassed I didn't think of it.</span></font></div>
</div><div><span class="yiv1111071637Apple-style-span" style="font-size:14px;line-height:16px;"><font class="yiv1111071637Apple-style-span" face="verdana, sans-serif"><br></font></span></div></div><div><span class="yiv1111071637Apple-style-span" style="font-size:14px;line-height:16px;"><font class="yiv1111071637Apple-style-span" face="verdana, sans-serif">That works well for small numbers, but I'm guessing it will evaluate the entire list so it should not be used for large inputs. If you have a large interval and use a relatively small part of it, the following function should be significantly faster (it builds a random permutation lazily): &nbsp;</font></span></div>
<div><font class="yiv1111071637Apple-style-span" face="verdana, sans-serif"><span class="yiv1111071637Apple-style-span" style="font-size:14px;line-height:16px;"><br></span></font></div><div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">import System.Random</font></div>
<div><div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">randomOrder :: (Ord a, Num a, Random a, RandomGen g) =&gt; (a,a) -&gt; g -&gt; [a]</font></div><div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">randomOrder (low,high) g&nbsp;</font></div>
<div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp;| low &gt; high &nbsp;= []</font></div><div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp;| otherwise &nbsp; = let</font></div><div>
<font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp;(a,g') = randomR (low,high) g</font></div><div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp;(gl,gr) = split g'</font></div>
<div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp;in a : mergeRandom (a-1-low,randomOrder (low,a-1) gl)&nbsp;</font></div><div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (high-a-1, randomOrder (a+1,high) gr) g'</font></div>
<div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; where</font></div><div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp; mergeRandom (_,[]) (_,xs) _ &nbsp; &nbsp; &nbsp; = xs</font></div>
<div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp; mergeRandom (_,xs) (_,[]) _ &nbsp; &nbsp; &nbsp; = xs</font></div><div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp; mergeRandom (lx,x:xs) (ly,y:ys) g = let</font></div>
<div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp; &nbsp; (pick,g') = randomR (1,lx + ly) g</font></div><div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp; &nbsp; in if pick &lt;= lx&nbsp;</font></div>
<div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; then x : mergeRandom (lx-1,xs) (ly,y:ys) g'</font></div><div><font class="yiv1111071637Apple-style-span" face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; else y : mergeRandom (lx,x:xs) (ly-1,ys) g'</font></div>
</div><div><br></div><br><br><div class="yiv1111071637gmail_quote">On 14 June 2011 04:31, michael rice <span dir="ltr">&lt;<a rel="nofollow" ymailto="mailto:nowgate@yahoo.com" target="_blank" href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;</span> wrote:<br><blockquote class="yiv1111071637gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="top" style="font:inherit;"><div><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td style="font:inherit;"><font size="2">Thanks, all.</font><div style="font-family:arial;font-size:10pt;">
<br></div><div style="font-family:arial;font-size:10pt;">It seemed like something like this should exist in a prob/stat package, and if so, didn't want to reinvent the wheel.</div><div class="yiv1111071637im"><div style="font-family:arial;font-size:10pt;">
<br></div><div style="font-family:arial;font-size:10pt;"><span style="font-family:monospace;font-size:14px;line-height:16px;">Shuffle [1..20], then take 5?</span></div><div style="font-family:arial;font-size:10pt;"><span style="font-family:monospace;font-size:14px;line-height:16px;"><br>
</span></div></div><div style="font-family:arial;font-size:10pt;"><span style="font-family:monospace;font-size:14px;line-height:16px;">Yes, so simple, I'm embarrassed I didn't think of it.</span></div><div style="font-family:arial;font-size:10pt;">
<span style="font-family:monospace;font-size:14px;line-height:16px;"><br></span></div><div style="font-family:arial;font-size:10pt;"><span style="font-family:monospace;font-size:14px;line-height:16px;">Michael</span></div><div style="font-family:arial;font-size:10pt;">
<span style="font-family:monospace;font-size:14px;line-height:16px;"><br></span></div><div><font face="monospace"><span style="font-size:14px;line-height:16px;"><br></span></font></div><div style="font-family:arial;font-size:10pt;">
<br>--- On <b>Mon, 6/13/11, Felipe Almeida Lessa <i>&lt;<a rel="nofollow" ymailto="mailto:felipe.lessa@gmail.com" target="_blank" href="/mc/compose?to=felipe.lessa@gmail.com">felipe.lessa@gmail.com</a>&gt;</i></b> wrote:<br><blockquote style="border-left:2px solid rgb(16, 16, 255);margin-left:5px;padding-left:5px;">
<br>From: Felipe Almeida Lessa &lt;<a rel="nofollow" ymailto="mailto:felipe.lessa@gmail.com" target="_blank" href="/mc/compose?to=felipe.lessa@gmail.com">felipe.lessa@gmail.com</a>&gt;<br>Subject: Re: [Haskell-cafe] Acquiring a random set of a specific size (w/o dups) from a range of Ints<br>
To: "michael rice" &lt;<a rel="nofollow" ymailto="mailto:nowgate@yahoo.com" target="_blank" href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;<br>Cc: <a rel="nofollow" ymailto="mailto:haskell-cafe@haskell.org" target="_blank" href="/mc/compose?to=haskell-cafe@haskell.org">haskell-cafe@haskell.org</a><br>Date: Monday, June 13, 2011, 9:38 PM<div class="yiv1111071637im">
<br><br><div>On Mon, Jun 13, 2011 at 8:56 PM, michael rice &lt;<a rel="nofollow">nowgate@yahoo.com</a>&gt; wrote:<br>&gt; Is there an (existing) way to select 5 Ints randomly (no duplicates) from a population, say 1-20 (inclusive)?<br>
<br>Yes, already implemented in the monte-carlo package as sampleSubset [1],<br><br>&nbsp; sampleSubset :: MonadMC m =&gt; [a] -&gt; Int
 -&gt; m [a]<br><br>Complete example code for your example:<br><br>&nbsp; evalMC (sampleSubset [1..20] 5) (mt19937 0)<br><br>Cheers!<br><br>[1] <a rel="nofollow" target="_blank" href="http://hackage.haskell.org/packages/archive/monte-carlo/0.4.1/doc/html/Control-Monad-MC-Class.html#v:sampleSubset">http://hackage.haskell.org/packages/archive/monte-carlo/0.4.1/doc/html/Control-Monad-MC-Class.html#v:sampleSubset</a><br>
<br>--<br>Felipe.<br></div></div></blockquote></div></td></tr></tbody></table></div></td></tr></tbody></table><br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a rel="nofollow" ymailto="mailto:Haskell-Cafe@haskell.org" target="_blank" href="/mc/compose?to=Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a rel="nofollow" target="_blank" href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br>
</div></blockquote></div></td></tr></table>