RosettaCodeData/Task/Monte-Carlo-methods/JavaScript/monte-carlo-methods-2.js

40 lines
908 B
JavaScript

(() => {
"use strict";
// --- APPROXIMATION OF PI BY A MONTE CARLO METHOD ---
// monteCarloPi :: Int -> Float
const monteCarloPi = n =>
4 * enumFromTo(1)(n).reduce(a => {
const [x, y] = [rnd(), rnd()];
return (x ** 2) + (y ** 2) < 1 ? (
1 + a
) : a;
}, 0) / n;
// --------------------- GENERIC ---------------------
// enumFromTo :: Int -> Int -> [Int]
const enumFromTo = m =>
n => Array.from({
length: 1 + n - m
}, (_, i) => m + i);
// rnd :: () -> Float
const rnd = Math.random;
// ---------------------- TEST -----------------------
// From 1000 samples to 10E7 samples
return enumFromTo(3)(7).forEach(x => {
const nSamples = 10 ** x;
console.log(
`${nSamples} samples: ${monteCarloPi(nSamples)}`
);
});
})();