【问题标题】:Math.random and web programming in JavaScriptJavaScript 中的 Math.random 和 Web 编程
【发布时间】:2013-10-30 17:01:40
【问题描述】:

根据this Stack Overflow thread,JavaScript 中的 Math.random() 取决于浏览器或操作系统。基本上,这意味着 JavaScript 没有生成统一随机变量的标准算法。 This thread 似乎暗示 Chrome 的统一随机数算法特别糟糕。

在我的程序中,我尝试根据一些信息和随机噪声来了解用户的行为方式。我对 Math.random() 生成的数字使用 Box-Muller 变换来生成高斯随机数。这是否意味着使用一种浏览器的用户会遇到与其他浏览器不同类型的噪音?注意我使用 Box Muller 是因为我不关心速度,但我知道它对伪随机数的生成方式特别敏感。似乎有很多关于为什么 Math.random() 不好的线程,但在线程中并没有那么多关于实际使用什么的线程。最佳做法是什么?由于我使用 Box-Muller 转换为高斯数,有什么需要特别注意的吗?

【问题讨论】:

  • 这大概是您感兴趣的 JavaScript - 为什么您提到(并标记)Java?
  • java 和 javascript 就像汽车和地毯一样相互关联
  • 抱歉打错了,已修复
  • 考虑向在线随机数生成器 API 发出 AJAX 请求,以一次获取一批随机数并使用它。这意味着无论浏览器如何,数字的随机性都将来自同一来源。

标签: javascript random


【解决方案1】:

http://en.wikipedia.org/wiki/Xorshift 有一个基于 xor-shift 的 RNG,具有良好的随机性,应该很容易移植到 JavaScript:

编辑完成:

(function () {
    var x = 123456789;
    var y = 362436069;
    var z = 521288629;
    var w = 88675123;
    var f = Math.pow(2, -32);

    Object.defineProperty(Math, 'xor128', {
        value: function () {
            var t = x ^ (x << 11);
            x = y;
            y = z;
            z = w;
            w = w ^ (w >>> 19) ^ (t ^ (t >>> 8));

            return (w >>> 0) * f;  // convert to floating point          
        }
    });

})();

注意:这仅使用生成的 128 位中的 32 位来产生浮点结果。理论上,您可以将来自其他状态变量之一的另外 20 位组合起来以产生 52 位的结果。

我能看到的最重要的问题是它不支持播种 - 它总是会生成相同的序列。

【讨论】:

  • 有趣的是,我什至不知道这个算法,不幸的是,缺少种子集有点破坏交易(我不希望每次都使用相同的序列)。但是,我可以修改它以包含种子集吗?
  • @user1544793 自发布此消息以来我已经进行了一些搜索,似乎 x、y、z 和 w 中的初始值并不重要 - 这是真正的位移序列工作。
【解决方案2】:

Box-Muller 转换仅适用于均匀分布输入。根据MDN(最后一个例子),Math.random() 不会生成均匀分布的数字。

ECMAScript specification 对Math.random() 说如下:

返回一个带正号的数值,大于或等于 0 但小于 1,随机或伪随机选择,在该范围内近似均匀分布,使用依赖于实现的算法或策略.此函数不接受任何参数。

所以,这取决于浏览器。浏览器可能但不必实现完美均匀分布的随机数生成器。

因此,您无法在浏览器端使用 Math.random() 在 Javascript 中可靠地实现跨浏览器 Box-Muller 转换

【讨论】:

  • 哦,哇,谢谢。我什至从未意识到浏览器部署的算法不必使用均匀分布。感谢您的信息!
猜你喜欢
  • 2011-07-31
  • 2017-05-03
  • 2018-08-27
  • 2023-04-11
  • 1970-01-01
  • 2017-02-19
  • 2018-06-03
  • 2010-11-06
  • 2023-03-28
相关资源
最近更新 更多