实现random
首先用mwc1616算法写一个伪随机
const MAX_RAND = Math.pow(2, 32);
var state = [1, 2];
function mwc1616() {
var r0 = 18030 * (state[0] & 0xFFFF) + (state[0] >>> 16);
var r1 = 36969 * (state[1] & 0xFFFF) + (state[1] >>> 16);
state = [r0, r1];
var x = ((r0 << 16) + (r1 & 0xFFFF))
if (x < 0) x = x + MAX_RAND;
return x / MAX_RAND;
}
为保证初次随机种子不一样,用当前时间戳当种子,最终结果如下
Math._random = (() => {
const MAX_RAND = Math.pow(2, 32);
let seed0 = Date.now(), seed1 = ~seed0;
return () => {
seed0 = 18030 * (seed0 & 0xFFFF) + (seed0 >>> 16);
seed1 = 36969 * (seed1 & 0xFFFF) + (seed1 >>> 16);
var x = ((seed0 << 16) + (seed1 & 0xFFFF))
if (x < 0) x = x + MAX_RAND;
return x / MAX_RAND;
}
})();
实现sqrt
这里使用牛顿迭代法快速寻找平方根:首先猜一个近似值x,然后不断令x等于x和a/x的平均数。
Math._sqrt = num => {
let x = num, last = 0;
do {
last = x;
x = (x + num / x) / 2;
} while (Math.abs(x - last) > Number.EPSILON)
return x;
}
最后添加边界处理,完整版如下
Math._sqrt = num => {
num = +num;
if (num < 0 || isNaN(num)) return NaN;
let x = num, last = 0;
do {
last = x;
x = (x + num / x) / 2;
} while (Math.abs(x - last) > Number.EPSILON)
return x;
}