UNPKG

chancejs

Version:

Various pseudo-random implementations packaged with helpful random utilities

144 lines (125 loc) 16.9 kB
<html> <meta charset='utf-8'> <title>src/random.coffee</title> <head> <link rel='stylesheet' media='all' href='docco.css'> <link href='http://fonts.googleapis.com/css?family=Lato:300' rel='stylesheet' type='text/css'> <script src='http://code.jquery.com/jquery-1.6.2.min.js' type='text/javascript' charset='utf-8'></script> <script src='docco.js' type='text/javascript' charset='utf-8'></script> <script> $(document).ready(function(){ $('#menu').columnview(); $('#jump_show').click(function(){ $('#jump_to').toggleClass('visible') }) var p = "src/random.coffee".split('/') var f = p.pop() for(var i=0;i<p.length;i++){ var s = p[i] + "/" $("#jump_page div a span.label").filter(function(){ return $(this).text() == s }).parent().click() } $("#jump_page div a span.label").filter(function(){ return $(this).text() == f }).last().parent().toggleClass('active') }) </script> </head> <body> <div id='container'> <div id='jump_to'><div id='jump_page'> <ul class='menu' id='menu'> <li class='leaf'><a href='#'>src/</a><ul class='menu'><li class='leaf'><a href='src_random.html'>random.coffee</a></li><li class='leaf'><a href='#'>seeds/</a><ul class='menu'><li class='leaf'><a href='src_seeds_lagged_fibonnacci.html'>lagged_fibonnacci.coffee</a></li><li class='leaf'><a href='src_seeds_linear.html'>linear.coffee</a></li><li class='leaf'><a href='src_seeds_linear_congruential.html'>linear_congruential.coffee</a></li><li class='leaf'><a href='src_seeds_math_random.html'>math_random.coffee</a></li><li class='leaf'><a href='src_seeds_mersenne_twister.html'>mersenne_twister.coffee</a></li><li class='leaf'><a href='src_seeds_no_random.html'>no_random.coffee</a></li></ul></li></ul></li> </ul> </div> <div id='jump_show'> Jump To &hellip; </div></div> <table cellpadding='0' cellspacing='0'> <tr> <th class='docs'> <h3>src/</h3> <h1>random.coffee</h1> </th> <th class='code'> <pre></pre> </th> </tr> <tr> <td class='docs'></td> <td class='code'><div class="highlight"><pre><span class="p">{</span><span class="nx">floor</span><span class="p">,</span> <span class="nx">round</span><span class="p">}</span> <span class="o">=</span> <span class="nb">Math</span> <span class="k">class</span> <span class="nb">Random</span> <span class="py">constructor</span><span class="o">:</span> <span class="p">(</span><span class="py">@generator</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="py">get</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="py">@generator</span><span class="p">.</span><span class="nx">get</span><span class="p">()</span> <span class="py">boolean</span><span class="o">:</span> <span class="p">(</span><span class="nv">rate</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nv">rate </span><span class="o">=</span> <span class="mf">0.5</span> <span class="k">unless</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="nx">rate</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">;</span> <span class="py">@get</span><span class="p">()</span> <span class="o">&lt;</span> <span class="nx">rate</span> <span class="py">bit</span><span class="o">:</span> <span class="p">(</span><span class="nv">rate</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">if</span> <span class="py">@boolean</span> <span class="nx">rate</span> <span class="k">then</span> <span class="mi">1</span> <span class="k">else</span> <span class="mi">0</span> <span class="py">sign</span><span class="o">:</span> <span class="p">(</span><span class="nv">rate</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">if</span> <span class="py">@boolean</span> <span class="nx">rate</span> <span class="k">then</span> <span class="mi">1</span> <span class="k">else</span> <span class="o">-</span><span class="mi">1</span> <span class="py">char</span><span class="o">:</span> <span class="p">(</span><span class="nx">arg</span><span class="p">,</span> <span class="nx">rangeEnd</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="nx">arg</span><span class="p">,</span> <span class="nx">rangeEnd</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;abcdefghijklmnopqrstuvwxyz&#39;</span><span class="p">,</span> <span class="kc">null</span><span class="p">]</span> <span class="k">unless</span> <span class="nx">arg</span><span class="o">?</span> <span class="k">switch</span> <span class="k">typeof</span> <span class="nx">arg</span> <span class="k">when</span> <span class="s">&#39;string&#39;</span> <span class="k">if</span> <span class="k">typeof</span> <span class="nx">rangeEnd</span> <span class="o">is</span> <span class="s">&#39;string&#39;</span> <span class="nv">str </span><span class="o">=</span> <span class="s">&#39;&#39;</span> <span class="nx">arg</span><span class="p">.</span><span class="nx">to</span> <span class="nx">rangeEnd</span><span class="p">,</span> <span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">str</span> <span class="o">+=</span> <span class="nx">c</span> <span class="nv">arg </span><span class="o">=</span> <span class="nx">str</span> <span class="nx">arg</span><span class="p">.</span><span class="nx">substr</span> <span class="py">@intRandom</span><span class="p">(</span><span class="nx">arg</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="mi">1</span> <span class="k">when</span> <span class="s">&#39;number&#39;</span> <span class="k">if</span> <span class="k">typeof</span> <span class="nx">rangeEnd</span> <span class="o">is</span> <span class="s">&#39;number&#39;</span> <span class="nv">n </span><span class="o">=</span> <span class="nb">String</span><span class="p">.</span><span class="nx">fromCharCode</span> <span class="nx">floor</span> <span class="py">@inRange</span> <span class="nx">arg</span><span class="p">,</span> <span class="nx">rangeEnd</span> <span class="k">else</span> <span class="nb">String</span><span class="p">.</span><span class="nx">fromCharCode</span> <span class="py">@intRandom</span> <span class="nx">arg</span> <span class="py">inRange</span><span class="o">:</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nv">res </span><span class="o">=</span> <span class="nx">a</span> <span class="o">+</span> <span class="py">@random</span> <span class="nx">b</span> <span class="o">-</span> <span class="nx">a</span> <span class="k">if</span> <span class="k">typeof</span> <span class="nx">c</span> <span class="o">is</span> <span class="s">&#39;number&#39;</span> <span class="nv">r </span><span class="o">=</span> <span class="mi">1</span> <span class="o">/</span> <span class="nx">c</span> <span class="nx">res</span> <span class="o">-=</span> <span class="nx">res</span> <span class="o">%</span> <span class="nx">c</span> <span class="k">unless</span> <span class="nx">floor</span><span class="p">(</span><span class="nx">res</span> <span class="o">*</span> <span class="nx">r</span><span class="p">)</span> <span class="o">is</span> <span class="nx">res</span> <span class="o">*</span> <span class="nx">r</span> <span class="nv">res </span><span class="o">=</span> <span class="nx">floor</span><span class="p">(</span><span class="nx">res</span> <span class="o">*</span> <span class="mi">1000000000</span><span class="p">)</span> <span class="o">/</span> <span class="mi">1000000000</span> <span class="nx">res</span> <span class="py">inArray</span><span class="o">:</span> <span class="p">(</span><span class="nx">array</span><span class="p">,</span> <span class="nx">ratios</span><span class="p">,</span> <span class="nx">summed</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">if</span> <span class="nx">array</span><span class="o">?</span> <span class="k">if</span> <span class="nx">ratios</span><span class="o">?</span> <span class="k">if</span> <span class="nx">ratios</span><span class="p">.</span><span class="nx">length</span> <span class="o">isnt</span> <span class="nx">array</span><span class="p">.</span><span class="nx">length</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s">&#39;array and ratios arrays must have the same length&#39;</span> <span class="k">for</span> <span class="nx">b</span><span class="p">,</span><span class="nx">i</span> <span class="k">in</span> <span class="nx">ratios</span> <span class="k">if</span> <span class="nx">i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="nv">a </span><span class="o">=</span> <span class="nx">ratios</span><span class="p">[</span><span class="nx">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nx">a</span> <span class="o">&gt;</span> <span class="nx">b</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s">&#39;ratios must be ordered when summed is true&#39;</span> <span class="k">if</span> <span class="nx">summed</span> <span class="nv">last </span><span class="o">=</span> <span class="nx">ratios</span><span class="p">[</span><span class="nx">ratios</span><span class="p">.</span><span class="nx">length</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="nv">ratios </span><span class="o">=</span> <span class="nx">ratios</span><span class="p">.</span><span class="nx">map</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">n</span> <span class="o">/</span> <span class="nx">last</span> <span class="k">else</span> <span class="nv">sum </span><span class="o">=</span> <span class="nx">ratios</span><span class="p">.</span><span class="nx">reduce</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span> <span class="nv">ratios </span><span class="o">=</span> <span class="nx">ratios</span><span class="p">.</span><span class="nx">map</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">n</span> <span class="o">/</span> <span class="nx">sum</span> <span class="nx">ratios</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">+=</span> <span class="nx">ratios</span><span class="p">[</span><span class="nx">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="nx">n</span><span class="p">,</span><span class="nx">i</span> <span class="k">in</span> <span class="nx">ratios</span> <span class="k">when</span> <span class="nx">i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="nv">rand </span><span class="o">=</span> <span class="py">@get</span><span class="p">()</span> <span class="k">return</span> <span class="nx">array</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="k">for</span> <span class="nx">v</span><span class="p">,</span><span class="nx">i</span> <span class="k">in</span> <span class="nx">ratios</span> <span class="k">when</span> <span class="nx">rand</span> <span class="o">&lt;=</span> <span class="nx">v</span> <span class="k">else</span> <span class="nx">array</span><span class="p">[</span><span class="py">@intRandom</span> <span class="nx">array</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="k">else</span> <span class="kc">null</span> <span class="k">in</span><span class="o">:</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">if</span> <span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="k">then</span> <span class="py">@inArray</span> <span class="nx">arguments</span> <span class="k">else</span> <span class="k">switch</span> <span class="k">typeof</span> <span class="nx">a</span> <span class="k">when</span> <span class="s">&#39;number&#39;</span> <span class="k">then</span> <span class="py">@inRange</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span> <span class="k">when</span> <span class="s">&#39;string&#39;</span> <span class="k">then</span> <span class="py">@inArray</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span> <span class="k">when</span> <span class="s">&#39;object&#39;</span> <span class="k">if</span> <span class="nb">Object</span><span class="o">::</span><span class="nx">toString</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="o">==</span> <span class="s">&#39;[object Array]&#39;</span> <span class="py">@inArray</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">a</span><span class="p">.</span><span class="nx">min</span><span class="o">?</span> <span class="o">and</span> <span class="nx">a</span><span class="p">.</span><span class="nx">max</span><span class="o">?</span> <span class="k">then</span> <span class="py">@inRange</span> <span class="nx">a</span><span class="p">.</span><span class="nx">min</span><span class="p">,</span> <span class="nx">a</span><span class="p">.</span><span class="nx">max</span><span class="p">,</span> <span class="nx">a</span><span class="p">.</span><span class="nx">step</span> <span class="k">else</span> <span class="kc">null</span> <span class="py">sort</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="o">=&gt;</span> <span class="py">@intPad</span> <span class="mi">2</span> <span class="py">random</span><span class="o">:</span> <span class="p">(</span><span class="nx">amount</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="py">@get</span><span class="p">()</span> <span class="o">*</span> <span class="p">(</span><span class="nx">amount</span> <span class="o">or</span> <span class="mi">1</span><span class="p">)</span> <span class="py">intRandom</span><span class="o">:</span> <span class="p">(</span><span class="nx">amount</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">round</span> <span class="py">@random</span> <span class="nx">amount</span> <span class="py">pad</span><span class="o">:</span> <span class="p">(</span><span class="nx">amount</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">amount</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="py">@random</span> <span class="nx">amount</span> <span class="py">intPad</span><span class="o">:</span> <span class="p">(</span><span class="nx">amount</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">round</span> <span class="py">@pad</span> <span class="nx">amount</span> <span class="nv">module.exports </span><span class="o">=</span> <span class="nb">Random</span> </pre></div></td> </tr> </table> </div> </body> </html>