Probability Calculator

by jnichols

HTML

<img src="http://i.imgur.com/McV5qBt.gif" width="570px"/>
<div id="controls">
    <label>W <br/><input type="number" id="W" value="100"/></label>
    <label>t <br /><input type="number" id="t" value = "1"/></label>
    <label>q <br /><input type="number" id="q" value="5500"/></label><br/>
    <button id="plot">Plot</button>
</div>
<div id="graph" class="graphContainer"></div>

CSS

label{
    display:block;
    float:left;
}
div.graphContainer{
    height:375px;
    width:550px;
    background-color:white;
}
div
{
    width:550px;
    text-align:center;
    background-color:lightblue;
    padding:10px;
}
input
{
    width:8em;
    text-align:right;
}

.axis path, .axis line
{
    stroke:black;
    stroke-width:2;
    shape-rendering:crisp;
    fill:none;
}

path.line{
    stroke-width:8px;
}

.overlay {
  fill: none;
  pointer-events: all;
}
svg{
    fill:white;
}
svg text{
    stroke:none;
    fill:black;
    font-weight:bold;
}

.axis .tick text{
    font-weight:normal;
    
}

JavaScript

var log = 3;
function nCr(n,r){
    var p=1;
    var twos = 0;
    //var log =5;
    for(var i=0; i<r; i++){
        p= p * (n-i) / (2*i+2);
        if((p ==0) && log>0){
            console.warn("Failed in multiplication phase :nCr("+n+"," + r+")");
            console.log("Twos : "+ twos);        
            log--;
        }
        while(!isFinite(p*(n-i-1)/(i+2)))
        {
            p=p/2;
            twos++;
        }
    }
    while(twos>0 && p<1000000){
        p=p*2;
        twos--;
    }
    for(i; i<n; i++){
        if(twos>0)
           twos--;
        else if(p/2>0)
            p=p/2;
        else
            twos--;
    }
    while(twos>0){
        p=p*2;
        twos--;
    }
    
    if(((p ==0) ||(twos !=0)) && log>0){
        console.warn("Failed at :nCr("+n+"," + r+")");
        console.log("Twos : "+ twos);        
        log--;
    }

    return p;
}

function P(W,t,q){
    //Known
    q = q || 1000;
    W = W || 100;
    t = t || 1;
       
    var s, n, k;
    var prod=[];
    
    
    for(n=1; n<=q; n++)
    {
        k=(W+(t*n))/2/t;
        if(n%2==0 && n>=k)
        {
            //multiply some big numbers       
            s=nCr(n,k);
                
        }
        else
            s=0;

        prod.push(1-s);
        
    }

    return prod;
    
}

function process(prod){
    var data=[];
    var temp=1;
    for (var j =0; j<prod.length; j++)
    {
        data[j]={x:j, y:(1-prod[j]*temp)};
        temp=prod[j]*temp;
    }
    return data;
}

function processIndividual(prod,pop,da){
    var data=[];
    var temp;
    var t2;
    var logLim = 10;
    for (var j =0; j<prod.length; j++)
    {
        t2 = j>0?da[j-1].y*1:0; 
        temp = 1 - Math.pow((1-da[j].y*1+t2),pop);
        if(j%2==0 && j>0)
            temp=data[j-1].y;
        if(logLim > 0 && isNaN(temp))
        {
            logLim--;
            console.log(j);
            console.log(prod[j]);
            console.log(Math.pow((prod[j]),pop));
           ...