用javascript实现random、sqrt

164 阅读1分钟

实现random

首先用mwc1616算法写一个伪随机

const MAX_RAND = Math.pow(232);
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(232);
    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;
}