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',
...