parts = 10; //podział na 10*10 części
n = 10000; // ilośc losowanych punktów w kazdym fragmencie
Opis metody: Metoda_Monte_Carlo
W naszym przypadku dzielimy obszar generowania punktów na parts*parts
części i w każdym z nich generujemy n
punktów i zliczamy poprzez reduce ilość punktów w okręgu.
for (i = 0; i < parts; i += 1) {
for (j = 0; j < parts; j += 1) {
db.pi_parts.insert({x_from: i/parts, x_to: (i+1)/parts, y_from: j/parts, y_to: (j+1)/parts, n: n, parts: parts })
}
}
var m = function () {
for (i = 0; i < this.n; i += 1) {
x = (Math.random() * (this.x_from - this.x_to)) + this.x_to;
y = (Math.random() * (this.y_from - this.y_to)) + this.y_to;
if (x*x + y*y <= 1) {
emit("count", 1)
}
}
};
var r = function (key, values) {
return Array.sum(values)
};
db.pi_parts.mapReduce(m, r, {out: "pi"});
> db.pi.findOne().value/(parts*parts*n) * 4
> 3.14142
Może mało dokładna metoda, lecz dobrze obrazuje uzycie map reduce