#!/usr/bin/env jsish "use strict"; function statisticsBasic(args:array|string=void, conf:object=void) { var options = { // Rosetta Code, Statistics/Basic rootdir :'', // Root directory. samples : 0 // Set sample size from options }; var self = { }; parseOpts(self, options, conf); function generateStats(n:number):object { var i, sum = 0, sum2 = 0; var hist = new Array(10); hist.fill(0); for (i = 0; i < n; i++) { var r = Math.random(); sum += r; sum2 += r*r; hist[Math.floor((r*10))] += 1; } var mean = sum/n; var stddev = Math.sqrt((sum2 / n) - mean*mean); var obj = {n:n, sum:sum, mean:mean, stddev:stddev}; return {n:n, sum:sum, mean:mean, stddev:stddev, hist:hist}; } function reportStats(summary:object):void { printf("Samples: %d, mean: %f, stddev: %f\n", summary.n, summary.mean, summary.stddev); var max = Math.max.apply(summary, summary.hist); for (var i = 0; i < 10; i++) { printf("%3.1f+ %-70s %5d\n", i * 0.1, 'X'.repeat(70 * summary.hist[i] / max), summary.hist[i]); } return; } function main() { LogTest('Starting', args); switch (typeof(args)) { case 'string': args = [args]; break; case 'array': break; default: args = []; } if (self.rootdir === '') self.rootdir=Info.scriptDir(); Math.srand(0); if (self.samples > 0) reportStats(generateStats(self.samples)); else if (args[0] && parseInt(args[0])) reportStats(generateStats(parseInt(args[0]))); else for (var n of [100, 1000, 10000]) reportStats(generateStats(n)); debugger; LogDebug('Done'); return 0; } return main(); } provide(statisticsBasic, 1); if (isMain()) { if (!Interp.conf('unitTest')) return runModule(statisticsBasic); ;' statisticsBasic unit-test'; ; statisticsBasic(); } /* =!EXPECTSTART!= ' statisticsBasic unit-test' statisticsBasic() ==> Samples: 100, mean: 0.534517, stddev: 0.287124 0.0+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 8 0.1+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 11 0.2+ XXXXXXXXXXXXXXXXXXXXXXXXXX 6 0.3+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 10 0.4+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 10 0.5+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 11 0.6+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 8 0.7+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 16 0.8+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 7 0.9+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 13 Samples: 1000, mean: 0.490335, stddev: 0.286562 0.0+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 98 0.1+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 122 0.2+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 85 0.3+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 106 0.4+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 105 0.5+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 101 0.6+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 93 0.7+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 106 0.8+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 98 0.9+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 86 Samples: 10000, mean: 0.499492, stddev: 0.287689 0.0+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 969 0.1+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 992 0.2+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 1067 0.3+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 1011 0.4+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 973 0.5+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 1031 0.6+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 971 0.7+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 999 0.8+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 991 0.9+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 996 0 =!EXPECTEND!= */