【问题标题】:random numbers across different browsers跨不同浏览器的随机数
【发布时间】:2013-07-05 07:53:31
【问题描述】:

我想为每个访问者分配一个随机数,以启用 A/B 测试等功能。我还想在客户端而不是服务器上生成数字。而且由于它应该很快,我想使用 Math.random()

我现在的问题是:我会得到随机分布的数字还是不同的实现会扭曲数字?

干杯 瓦伦丁

【问题讨论】:

  • 我认为不仅仅是“随机”,您还需要“独特”。我会使用当前日期加上随机数的组合,或者可能是 sha1 或类似的东西。
  • 如果您在客户端进行操作而没有与服务器通信,您将有一些发生冲突的机会。为了减少这种机会,您必须使用一些大数字。
  • @elclanrs 获得一个唯一号码对我来说是 +1。更重要的是均匀分布。假设 50% 应该看到一种变化,而后半部分应该看到另一种变化。

标签: javascript random cross-browser


【解决方案1】:

您可以使用下面的javascript来测试javascript的Math.random的有效随机分布:

var totalAbove  =0;
var totalBelow = 0
for(var i=0;i<10000;i++){
    var randomNumber = Math.ceil(Math.random()*1000)
    if(randomNumber > 500){
        totalAbove++
    }else{
        totalBelow++
    }
}

var belowSplit = (totalBelow / 10000) * 100
var aboveSplit = (totalAbove / 10000 ) * 100
alert("Above 500: " + totalAbove + "\n" + "Below 500: " + totalBelow + "\n split: " + belowSplit + "/" + aboveSplit);

或使用这个 jsfiddle:http://jsfiddle.net/VN3Bd/

您可以在不同的浏览器上试用它,看看它的行为是否不同,但我想您会发现分布相当均匀。

我认为你可以依靠 Math.random 来完成这项工作。

【讨论】:

  • 所以想法是:如果所有浏览器生成一个均匀分布,那么所有浏览器生成的数字的总和也是均匀分布的?这是一个有效的假设吗?
  • 是的。我实际上一直在使用类似的东西,而且效果很好。只要您愿意将自己的分布控制在统计范围内,而不是正好 50/50(或您正在寻找的任何百分比)
【解决方案2】:

一般而言,客户端的“Math.random()”实现对于随机分布以及生成它们的服务器来说应该足够好。但你不能确定。

【讨论】:

  • 您有什么理由相信这是真的?我也愿意相信!
  • 查看 Chromium-browser 的源码可以看到 Math.random 的实现。它也参考了 Safari 的随机性。测试是在一个带有 Mozilla 标记的文件中完成的。所以实现不应该有太大的不同。顺便说一句,规范应该是这样的:es5.github.io/x15.8.html#x15.8.2.14 所以这个问题真的依赖于随机的种子。分布式提高多样性和种子,所以随机分布应该和单服务器一样好。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 2021-07-06
相关资源
最近更新 更多