56 lines
1.0 KiB
JavaScript
56 lines
1.0 KiB
JavaScript
// An algorithm for picking a random number based on monte carlo method
|
||
function acceptreject(formula) {
|
||
// We do this “forever” until we find a qualifying random value.
|
||
while (true) {
|
||
// Pick a random value.
|
||
let r1 = random(1);
|
||
// Assign a probability.
|
||
let probability = formula(r1);
|
||
// Pick a second random value.
|
||
let r2 = random(1);
|
||
|
||
//{!3} Does it qualify? If so, we’re done!
|
||
if (r2 < probability) {
|
||
return r1;
|
||
}
|
||
}
|
||
}
|
||
|
||
class Walker {
|
||
constructor(x = 0, y = 0) {
|
||
this.x = x
|
||
this.y = y
|
||
}
|
||
|
||
step() {
|
||
let step = 1;
|
||
if (acceptreject(x => x*x) < 0.1) {
|
||
step = 20;
|
||
}
|
||
|
||
let dx = random(-step, step);
|
||
let dy = random(-step, step);
|
||
|
||
this.x += dx
|
||
this.y += dy
|
||
}
|
||
|
||
draw() {
|
||
stroke(0)
|
||
point(this.x, this.y)
|
||
}
|
||
}
|
||
|
||
let walker
|
||
|
||
function setup() {
|
||
createCanvas(640, 240)
|
||
background(255)
|
||
walker = new Walker(320, 120)
|
||
}
|
||
|
||
function draw() {
|
||
walker.step();
|
||
walker.draw();
|
||
}
|