Random number distribution

future fortune return distribution

by Yair Even Or

HTML

<script src="https://code.highcharts.com/highcharts.js"></script>

<figure class="highcharts-figure">
    <div id="container"></div>
</figure>

CSS

.highcharts-figure, .highcharts-data-table table {
    min-width: 360px; 
    max-width: 800px;
    margin: 1em auto;
}

.highcharts-data-table table {
	font-family: Verdana, sans-serif;
	border-collapse: collapse;
	border: 1px solid #EBEBEB;
	margin: 10px auto;
	text-align: center;
	width: 100%;
	max-width: 500px;
}
.highcharts-data-table caption {
    padding: 1em 0;
    font-size: 1.2em;
    color: #555;
}
.highcharts-data-table th {
	font-weight: 600;
    padding: 0.5em;
}
.highcharts-data-table td, .highcharts-data-table th, .highcharts-data-table caption {
    padding: 0.5em;
}
.highcharts-data-table thead tr, .highcharts-data-table tr:nth-child(even) {
    background: #f8f8f8;
}
.highcharts-data-table tr:hover {
    background: #f1f7ff;
}

JavaScript

let n = 100000;
let step = 1;
let max = 50;
let min = -20;
let data = {};


const randn_bm = (min, max, skew) => {
    var u = 1 -  Math.random(), v = 1 - Math.random();
    let num = Math.sqrt( -5.0 * Math.log( u ) ) * Math.cos( 5.0 * Math.PI * v );

    num = num / 10.0 + 0.5 // Translate to 0 -> 1
    
    if (num > 1 || num < 0) 
    	num = randn_bm(min, max, skew); // resample between 0 and 1 if out of range

    else{
      num = Math.pow(num, skew); // Skew
      num *= max - min; // Stretch to fill range
      num += min; // offset to min
    }
    
    return num
}

const round_to_precision = (x, precision) => {
    var y = +x + (precision === undefined ? 0.5 : precision/2);
    return y - (y % (precision === undefined ? 1 : +precision));
}


// Seed data with a bunch of 0s
for (let j=min; j<max; j+=step) {
	data[j] = 0;
}

// Create n samples between min and max
for (i=0; i<n; i+=step) {
	let rand_num = randn_bm(min, max, .7);
  let rounded = round_to_precision(rand_num, step)
	data[rounded] += 1;
}

// Count number of samples at each increment
let hc_data = [];
for (const [key, val] of Object.entries(data)) {
	hc_data.push({"x": parseFloat(key), "y": val/n});
}

// Sort
hc_data = hc_data.sort(function(a, b){
    if(a.x < b.x) return -1;
    if(a.x > b.x) return 1;
    return 0;
});

Highcharts.chart('container', {


    title: {
        text: 'Normal Distribution'
    },


    yAxis: {
        title: {
            text: 'Percentage chance'
        }
    },

    xAxis: {
    	ordinal: false
    },

    legend: {
        layout: 'vertical',
        align: 'right',
        verticalAlign: 'middle'
    },

    plotOptions: {
    },

    series: [{
        name: 'Percent chance',
        data: hc_data
    }],

    responsive: {
        rules: [{
            condition: {
                maxWidth: 500
            },
            chartOptions: {
                legend: {
                    layout: 'horizontal',
                    align: 'center',
             ...