chancejs
Version:
Various pseudo-random implementations packaged with helpful random utilities
144 lines (125 loc) • 16.9 kB
HTML
<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 …
</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">-></span>
<span class="py">get</span><span class="o">:</span> <span class="o">-></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">-></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"><=</span> <span class="nx">rate</span> <span class="o"><=</span> <span class="mi">1</span><span class="p">;</span> <span class="py">@get</span><span class="p">()</span> <span class="o"><</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">-></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">-></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">-></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">'abcdefghijklmnopqrstuvwxyz'</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">'string'</span>
<span class="k">if</span> <span class="k">typeof</span> <span class="nx">rangeEnd</span> <span class="o">is</span> <span class="s">'string'</span>
<span class="nv">str </span><span class="o">=</span> <span class="s">''</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">-></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">'number'</span>
<span class="k">if</span> <span class="k">typeof</span> <span class="nx">rangeEnd</span> <span class="o">is</span> <span class="s">'number'</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">-></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">'number'</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">-></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">'array and ratios arrays must have the same length'</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">></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">></span> <span class="nx">b</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s">'ratios must be ordered when summed is true'</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">-></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">-></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">-></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">></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"><=</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">-></span>
<span class="k">if</span> <span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span> <span class="o">></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">'number'</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">'string'</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">'object'</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">'[object Array]'</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">-></span> <span class="o">=></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">-></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">-></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">-></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">-></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>