V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
damao2250
V2EX  ›  JavaScript

前端小白突然想到个问题,想请教一下各位 dalao, JavaScript 中的 Math.random()是如何实现随机数的?用了这么久,好像只知其然,而不知其所以然

  •  1
     
  •   damao2250 · 2020-09-27 18:55:50 +08:00 · 2454 次点击
    这是一个创建于 1542 天前的主题,其中的信息可能已经有所发展或是发生改变。
    4 条回复    2020-09-29 19:58:44 +08:00
    Xusually
        1
    Xusually  
       2020-09-27 19:03:09 +08:00   ❤️ 3
    每个浏览器的实现不一样,比如 Chrome V8 的实现:
    // ECMA 262 - 15.8.2.14
    var rngstate; // Initialized to a Uint32Array during genesis.
    function MathRandom() {
    var r0 = (MathImul(18030, rngstate[0] & 0xFFFF) + (rngstate[0] >>> 16)) | 0;
    rngstate[0] = r0;
    var r1 = (MathImul(36969, rngstate[1] & 0xFFFF) + (rngstate[1] >>> 16)) | 0;
    rngstate[1] = r1;
    var x = ((r0 << 16) + (r1 & 0xFFFF)) | 0;
    // Division by 0x100000000 through multiplication by reciprocal.
    return (x < 0 ? (x + 0x100000000) : x) * 2.3283064365386962890625e-10;
    }


    https://github.com/v8/v8/blob/dae6dfe08ba9810abbe7eee81f7c58e999ae8525/src/math.js#L144
    godblessumilk
        2
    godblessumilk  
       2020-09-27 19:23:14 +08:00 via Android
    不安全的,基本都属于伪随机数
    libook
        3
    libook  
       2020-09-28 11:16:23 +08:00
    真随机数的技术已经很成熟了,现代系统大多都提供了真随机数生成器,特别是操作系统。

    举个例子,Linux 操作系统上有 /dev/random 和 /dev/urandom 两个随机数生成器,感兴趣可以去查一下相关文献,简单来讲就是会检测计算机运行过程中的一些“噪声”,比如时间、IO 响应时间、外设信号变化、键盘敲击时机、鼠标位置变化,甚至是磁场波动,不同系统(发行版)、硬件环境能提供的“噪声”来源不同。

    JS 的 Math.random()没有规定底层实现细节,由各个 JS 引擎自己决定如何实现,最省事的方式就是直接调用系统的随机数生成器。
    damao2250
        4
    damao2250  
    OP
       2020-09-29 19:58:44 +08:00
    @Xusually
    @godblessumilk
    @libook
    感谢各位大佬的解答,小弟受教了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3831 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:22 · PVG 18:22 · LAX 02:22 · JFK 05:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.